在64位系统上使用C# PInvoke调用user32.dll

26

在64位的应用程序中,从user32.dll调用PInvoke是否有问题?虽然我已经成功地这样做了很多次,也从未出现过错误,但这似乎有些矛盾。我应该寻找user64.dll吗?

2个回答

37

名称user32.dll是具有误导性的。你正在调用的是64位版本的user32.dll。 64位版本位于%windir%\System32\user32.dll

32位版本包含与32位应用程序兼容的功能。 它位于%windir%\SysWOW64\user32.dll。您可以使用dumpbin实用程序来检查它们:

System32\user32.dll:

FILE HEADER VALUES
        8664 machine (x64)

SysWOW64\user32.dll:

FILE HEADER VALUES
         14C machine (x86)

1
现在它有些误导性,但最初起这个名字是为了区分16位和32位,不是吗?但他们几乎不能更改名称,那将会破坏太多东西... - Matthew Scharley
1
是的。我清楚地记得在我童年时代,Windows 3.1 中由“USER.EXE”引起的通用保护故障。 - Mehrdad Afshari
3
64位Windows系统中,System32目录仍然被称为System32,真是让人喜爱啊 :-) - Justin

1

正如您所描述的那样,没有user64.dll,这是由于.NET程序可以对CPU架构不可知,因此相同的代码需要在x86和x64上工作。
如果您将程序转移到x86平台,它仍将运行而无需进行任何修改。
我猜当他们命名user32.dll时,他们没有考虑到这些情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接