Windows Vista:无法加载DLL'x.dll':对内存位置的无效访问。 (DllNotFoundException)

时间:2020-03-05 18:43:36  来源:igfitidea点击:

我今天下午在装有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,甚至没有简单的示例也可以!!! :(该死的Vista。

解决方案

回答

计算机上是否已将代码部署在64位计算机上?我们可能还会遇到DEP问题。

编辑

This is a 1st gen Macbook Pro with a 1st gen Core Duo 2 Intel processor. Far from 64 bits.

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

Well, I've just turned DEP globally off to no avail. Same error.

好吧,我还读到人们在将计算机更新为Vista SP1之后会遇到此错误。这些安装的Vista是否带有SP1?

Turns out to be something completely different. Just for the sake of testing, I've disabled de UAC (note: I was not getting any prompt).

太好了,我实际上是建议这样做,但我认为我们可能已经尝试过了。

回答

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

回答

鉴于该异常是DllNotFoundException,我们可能想要尝试在Vista安装上安装任何开发工具之前,先使用Dependency Walker检查HardwareID.dll,以查看是否确实缺少依赖项。

回答

Unable to load DLL 'HardwareID.dll':
  Invalid access to memory location.
  (Exception from HRESULT: 0x800703E6)

DllNotFoundException的名称使我们感到困惑,这与查找或者加载DLL文件无关,问题是在加载DLL时,它进行了非法的内存访问,这导致加载过程失败。

就像这里的另一个发布者一样,我认为这是一个DEP问题,并且UAC等更改最终使我们可以为此应用程序禁用DEP。

回答

马丁

之所以没有得到UAC提示,是因为UAC只能更改流程的启动方式,一旦流程运行,它就必须保持在同一海拔高度。如果出现以下情况,UAC将提示发生:

  • Vista认为它是安装程序(此处有很多规则,最简单的规则是将其称为" setup.exe"),
  • 如果将其标记为"以管理员身份运行"(我们可以通过更改快捷方式或者exe的属性进行编辑),或者
  • 如果exe包含要求管理员权限的清单。

前两个选项是针对UAC之前的"旧版"应用程序的变通方法,对新应用程序执行此操作的正确方法是嵌入清单资源,以询问所需的特权。

某些程序(例如Process Explorer)似乎可以提升正在运行的进程(在这种情况下,当我们在文件菜单中选择"显示所有进程的详细信息"时),但它们的真正作用是启动一个新实例,而该新实例将没有提升最初运行的设备。如果仅应用程序的某些部分需要提升(例如特殊的"管理选项"对话框),这是推荐的方法。

回答

In addition to allowing full control to "Everyone" does the location also allow processes with a medium integrity level to write?

我该如何检查?我是Vista的新手,我不太喜欢它,它在VM中太慢,无法进行日常工作,而对于在虚拟机中使用VStudio来说,它并没有带来什么新功能。

从命令提示符到我们可以执行:

icacls C:\Folder

如果看到诸如"强制标签\高强制级别"之类的行,则该文件夹仅可用于高度完整性过程。如果没有这样的线路,则只要没有其他ACL拒绝访问(例如,基于用户),则介质完整性进程可以访问它。

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