4

我今天下午在一个装有 Windows Vista 的客户的盒子上进行测试(他有家,但我在 Business Edition 上进行测试,结果相同)。

我们使用 .DLL 获取计算机的硬件 ID。它的用法非常简单,我创建的示例程序有效。DLL 是来自 AzSdk 的 This。事实上,这在 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

我不知道是什么导致了问题,因为我可以完全控制文件夹。该项目是 ac#.net Windows Forms 应用程序,一切正常,除了对外部库的调用。

我这样声明它:(注意:它不是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 的情况下,即使是简单的示例也无法正常工作!!!:( 该死的维斯塔。

4

6 回答 6

4

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

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

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

于 2008-08-27T08:51:42.953 回答
2

@马丁

您没有收到 UAC 提示的原因是因为 UAC 只能更改进程的启动方式,一旦进程运行,它必须保持在相同的高度级别。UAC 将提示将在以下情况下发生:

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

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

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

于 2008-08-27T09:30:32.920 回答
1

你有代码部署在 64 位机器上的机器吗?您也可能遇到DEP问题。

编辑

这是配备第一代 Core Duo 2 Intel 处理器的第一代 Macbook Pro。远非 64 位。

我提到了 64 位,因为从 32 位到 64 位的低级别结构没有得到正确处理。由于这些机器不是 64 位的,那么禁用 DEP 很可能是合乎逻辑的下一步。Vista 确实比 XP SP2 更安全。

好吧,我刚刚在全球范围内关闭了 DEP,但无济于事。同样的错误。

好吧,我还读到有人在将机器更新到 Vista SP1 后收到此错误。这些 Vista 安装是否有 SP1?

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

太好了,我实际上打算这样做,但我想你可能已经尝试过了。

于 2008-08-27T01:24:48.190 回答
0

您是否向供应商提出了支持请求?也许 MacBook Pro 的硬件有些东西会阻止产品工作。

于 2008-08-27T02:19:22.037 回答
0

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

于 2008-08-27T02:21:22.390 回答
0

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

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

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

icacls C:\Folder

如果您看到诸如“Mandatory Label\High Mandatory Level”之类的行,则该文件夹只能由高完整性进程访问。如果没有这样的行,那么中等完整性进程可以访问它,前提是没有其他 ACL 拒绝访问(例如基于用户)。

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

于 2008-08-27T18:57:39.173 回答