我今天下午在一个装有 Windows Vista 的客户盒子上进行测试(他有家,但我在商业版上进行测试,结果相同)。
我们使用一个 .DLL 来获取计算机的硬件 ID。它的用法非常简单,我创建的示例程序可以运行。 Dll 是 This from AzSdk 。
事实上,这在 Windows XP 下非常有效。然而,出于一些奇怪的原因,在我们的项目中(更大的),我们得到了这个异常:
Exception Type: System.DllNotFoundException
Exception Message: Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID
我不知道是什么导致了问题,因为我可以完全控制文件夹。该项目是一个 c#.net Windows 窗体应用程序,一切正常,除了对外部库的调用。
我是这样声明的:(注意:它不是 COM 库,不需要注册)。
[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
bool NIC, bool CPU, bool BIOS, string sRegistrationCode);
然后调用代码非常简单:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = GetHardwareID(cb_HDD.Checked,
cb_NIC.Checked,
cb_CPU.Checked,
cb_BIOS.Checked,
"*Registration Code*");
}
当您创建示例应用程序时,它可以工作,但在我的项目中却没有。在 XP 下工作正常。关于在 Vista 中我应该怎么做才能使这项工作有任何想法?
正如我所说,该文件夹及其子文件夹对“所有人”具有完全控制权。
更新: 我没有安装 Vista SP 1。
更新 2: 我已经安装了 Vista SP1,现在,在禁用 UAC 的情况下,即使是简单的示例也无法运行!!! :(该死的Vista。
最佳答案
@Martín
您没有收到 UAC 提示的原因是因为 UAC 只能更改进程的启动方式 ,一旦进程运行,它必须保持在相同的高度级别。如果出现以下情况,UAC 将提示将发生:
前两个选项是针对 UAC 之前存在的“遗留”应用程序的解决方法,对新应用程序执行此操作的正确方法是 embed a manifest resource 请求您需要的权限。
一些程序,例如 Process Explorer 似乎提升了一个正在运行的进程(在这种情况下,当您在文件菜单中选择“显示所有进程的详细信息”时),但它们真正做的是启动一个新实例,并且是那个新实例被提升- 不是最初运行的那个。如果只有应用程序的某些部分需要提升(例如特殊的“管理选项”对话框),这是推荐的方法。
关于c# - Windows Vista : Unable to load DLL 'x.dll' : Invalid access to memory location. (DllNotFoundException),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29284/