我不断收到“无法在DLL'user32.dll'中找到名为'GetWindowLongPtrA'的入口点”

时间:2019-02-22 19:36:08

标签: c# .net winapi pinvoke getwindowlong

我正在尝试使用GetWindowLongPtrA,但我不断收到“无法在DLL'user32.dll'中找到名为'GetWindowLongPtrA'的入口点”。 (也SetWindowLongPtrA遇到相同的错误)。我已经尝试了许多在Google上找到的解决方案,但是他们没有解决。

这是我编写的函数的声明:

[DllImport("user32.dll")]
public static extern IntPtr GetWindowLongPtrA(IntPtr hWnd, int nIndex);

试图放置EntryPoint = "GetWindowLongPtrA",将GetWindowLongPtrA更改为GetWindowLongPtr,放置CharSet = CharSet.Ansi,并用GetWindowLongPtrW等切换到CharSet = CharSet.Unicode,等等没用。

我的计算机正好是“ 64位”(但是不能调用该64位WinAPI函数吗?)。操作系统是Windows 10。

[1]: https://i.stack.imgur.com/3JrGw.png

但是我的系统驱动器的可用空间不足。这可能是原因吗? enter image description here

该问题的解决方案是什么?

1 个答案:

答案 0 :(得分:4)

GetWindowLongPtr的32位版本中没有名为GetWindowLongPtrAGetWindowLongPtrWuser32.dll的函数:

32-bit user32.dll

使用GetWindowLongPtr而不管目标位数如何工作的原因是C和C ++ WinAPI代码是因为在32位代码中,它是一个调用GetWindowLong(A|W)的宏。它仅存在于user32.dll的64位版本中:

64-bit user32.dll

pinvoke.net上导入GetWindowLongPtr的文档包括一个代码示例,该代码示例说明了如何使此导入对目标位透明(请记住,当您实际尝试调用不包含以下内容的导入函数时,会引发错误不存在,不在DllImport行上):

[DllImport("user32.dll", EntryPoint="GetWindowLong")]
private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint="GetWindowLongPtr")]
private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);

// This static method is required because Win32 does not support
// GetWindowLongPtr directly
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
     if (IntPtr.Size == 8)
     return GetWindowLongPtr64(hWnd, nIndex);
     else
     return GetWindowLongPtr32(hWnd, nIndex);
}