我今天下午在一个装有 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 将提示将发生:

  • Vista 认为它是一个安装程序( lots of rules here ,最简单的是如果它被称为“setup.exe”),
  • 如果它被标记为“以管理员身份运行”(您可以通过更改快捷方式或 exe 的属性来编辑它),或
  • 如果 exe 包含请求管理员权限的 list 。

  • 前两个选项是针对 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/

    10-13 07:47