我今天下午在客户的盒子上测试了Windows Vista(他有家,但我在商业版上测试的结果相同)。
我们使用获取计算机硬件ID的.DLL。它的用法很简单,我创建的示例程序也很有效。 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*");
}
创建示例应用程序时,它可以正常工作,但在我的projectit中却没有。在XP下工作正常。关于我应该在Vista中做些什么来实现这项工作的任何想法? 正如我所说,该文件夹及其子文件夹具有“Everybody”的完全控制权。
更新:我没有安装Vista SP 1。
更新2:我已经安装了Vista SP1,现在,在禁用UAC的情况下,甚至没有简单的示例工作! :(该死的Vista。
答案 0 :(得分:4)
无法加载DLL'HardwareID.dll': 对内存位置的访问无效。 (HRESULT异常:0x800703E6)
DllNotFoundException的名称令您感到困惑 - 这不是查找或加载DLL文件的问题,问题是当加载DLL时,它会执行非法内存访问,导致加载过程失败。 / p>
就像这里的另一张海报一样,我认为这是一个DEP问题,并且您的UAC等更改最终允许您为此应用程序禁用DEP。
答案 1 :(得分:2)
@ Martín
您未获得UAC提示的原因是因为UAC只能更改进程启动的方式,一旦进程运行,它必须保持在相同的高程级别。如果出现以下情况,UAC将会提示:
前两个选项是UAC之前的“遗留”应用程序的变通方法,为新应用程序执行此操作的正确方法是embed a manifest resource要求您提供所需的权限。
某些程序(如Process Explorer)似乎会提升正在运行的进程(在这种情况下,当您选择“显示所有进程的详细信息”时),但他们真正做的是启动一个新实例,这是新的实例升级 - 而不是最初运行的实例。如果只有应用程序的某些部分需要提升(例如特殊的“管理选项”对话框),这是推荐的方法。
答案 2 :(得分:1)
您的机器是否在64位计算机上部署了代码?您还可能遇到DEP问题。
修改
这是第一代Macbook Pro,配备第一代Core Duo 2 Intel处理器。远离64位。
我提到了64位,因为在32位到64位的低级别结构中没有得到妥善处理。由于机器不是64位,因此很可能禁用DEP将是一个很好的逻辑下一步。 Vista确实比XP SP2更安全。
好吧,我刚刚将DEP全局转为无效。同样的错误。
好吧,我还读到人们在将计算机更新到Vista SP1后出现此错误。这些Vista安装是否有SP1?
原来是完全不同的东西。仅仅是为了测试,我已经禁用了de UAC(注意:我没有得到任何提示)。
很好,我实际上会建议,但我想你可能已经尝试过了。
答案 3 :(得分:0)
您是否向供应商提出了支持请求?也许有一些关于MacBook Pro硬件的东西阻止了产品的运行。
答案 4 :(得分:0)
鉴于异常是DllNotFoundException,您可能希望尝试使用Dependency Walker检查HardwareID.dll,然后在Vista安装上安装任何开发工具,以查看是否确实存在依赖项丢失。
答案 5 :(得分:0)
除了允许对“Everyone”进行完全控制外,该位置还允许具有中等完整性级别的进程写入吗?
我该如何检查?我是Vista的新手,我不太喜欢它,在VM中进行日常工作和在虚拟机中使用VStudio时速度太慢,它没有带来任何新的东西。
从命令提示符到您可以执行:
icacls C:\Folder
如果您看到诸如“强制标签\高强制等级”之类的行,则该文件夹只能用于高完整性过程。如果没有这样的线路,则介质完整性进程可以访问它,前提是没有其他ACL拒绝访问(例如,基于用户)。
编辑:忘记提及您可以使用/ setintegritylevel开关实际更改访问对象所需的完整性级别。