Windows Vista:无法加载 DLL“x.dll”:对内存位置的访问无效。(DllNotFound异常)

StackOverflow https://stackoverflow.com/questions/29284

今天下午我在客户的机器上进行了测试,该机器装有 Windows Vista(他在家,但我在商业版上进行测试,结果相同)。

我们使用 .DLL 来获取计算机的硬件 ID。它的用法非常简单,我创建的示例程序也可以工作。该DLL是 这来自 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,甚至连简单的示例都不起作用!:( 该死的维斯塔。

有帮助吗?

解决方案

@马丁

您没有收到 UAC 提示的原因是 UAC 只能更改进程的方式 开始了, ,一旦进程运行,它必须保持在相同的海拔高度。如果出现以下情况,UAC 将会提示:

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

前两个选项是 UAC 之前的“遗留”应用程序的解决方法,对于新应用程序执行此操作的正确方法是 嵌入清单资源 请求您需要的特权。

一些程序,例如 流程浏览器 似乎提升了正在运行的进程(在这种情况下,当您在文件菜单中选择“显示所有进程的详细信息”时),但它们真正做的是启动一个新实例,并且是该新实例被提升 - 而不是原来的实例原来运行。如果您的应用程序只有某些部分需要提升(例如一个特殊的“管理选项”对话框)。

其他提示

无法加载 DLL“HardwareID.dll”:对内存位置的访问无效。(HRESULT 的异常:0x800703E6)

DllNotFoundException 的名称会让您感到困惑 - 这不是查找或加载 DLL 文件的问题,问题是加载 DLL 时,它会进行非法内存访问,从而导致加载过程失败。

就像这里的另一张海报一样,我认为这是一个 DEP 问题,并且您的 UAC 等更改最终允许您为此应用程序禁用 DEP。

您部署代码的机器是64位机器吗?您也可能会遇到 DEP 问题。

编辑

这是配备第一代 Core Duo 2 Intel 处理器的第一代 Macbook Pro。离64位还差得很远。

我提到了 64 位,因为在低级别,从 32 位到 64 位的结构无法得到正确处理。由于计算机不是 64 位,因此下一步很可能禁用 DEP。Vista 确实比 XP SP2 更安全。

好吧,我刚刚全局关闭了 DEP,但没有效果。同样的错误。

嗯,我还了解到人们在将计算机更新到 Vista SP1 后遇到此错误。这些 Vista 安装有 SP1 吗?

事实证明是完全不同的东西。只是为了测试,我禁用了 de UAC(注意:我没有收到任何提示)。

太好了,我本来想建议的,但我想你可能已经尝试过了。

您是否向供应商提出过支持请求?也许 MacBook Pro 硬件存在某些问题,导致该产品无法正常工作。

鉴于异常是 DllNotFoundException,您可能需要尝试使用以下命令检查 HardwareID.dll 依赖步行者 在 Vista 上安装任何开发工具之前,请先检查是否确实缺少依赖项。

除了允许“每个人”完全控制之外,该位置还允许具有中等完整性级别的进程进行写入吗?

我该如何检查?我是 Vista 的新手,不太喜欢它,对于日常工作来说,它在虚拟机内太慢了,对于在虚拟机内使用 VStudio 来说,它没有带来任何新东西。

从命令提示符处您可以执行:

icacls C:\Folder

如果您看到诸如“强制标签\高强制级别”之类的行,则该文件夹只能由高完整性进程访问。如果没有这样的行,那么只要没有其他 ACL 拒绝访问(例如基于用户),中等完整性进程就可以访问它。

编辑:忘记提及您可以使用 /setintegritylevel 开关来实际更改访问对象所需的完整性级别。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top