我正在尝试使用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。
该问题的解决方案是什么?
答案 0 :(得分:4)
在GetWindowLongPtr
的32位版本中没有名为GetWindowLongPtrA
,GetWindowLongPtrW
或user32.dll
的函数:
使用GetWindowLongPtr
而不管目标位数如何工作的原因是C和C ++ WinAPI代码是因为在32位代码中,它是一个调用GetWindowLong(A|W)
的宏。它仅存在于user32.dll
的64位版本中:
在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);
}