This question already has answers here:
How do I pinvoke to GetWindowLongPtr and SetWindowLongPtr on 32-bit platforms?
(2个答案)
去年关闭。
我正在尝试使用
这是我编写的函数的声明:
尝试放入
我的计算机正好是“ 64位”(但是不能调用该64位WinAPI函数吗?)。操作系统是Windows 10。
但是我的系统驱动器用完了可用空间。这可能是原因吗?
这个问题有什么解决方案?
(2个答案)
去年关闭。
我正在尝试使用
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。
但是我的系统驱动器用完了可用空间。这可能是原因吗?
这个问题有什么解决方案?
最佳答案
在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);
}
07-26 06:43