This question already has answers here:
How do I pinvoke to GetWindowLongPtr and SetWindowLongPtr on 32-bit platforms?

(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。

c# - 我不断收到“在DLL'user32.dll'中找不到名为'GetWindowLongPtrA'的入口点”-LMLPHP

但是我的系统驱动器用完了可用空间。这可能是原因吗?
c# - 我不断收到“在DLL'user32.dll'中找不到名为'GetWindowLongPtrA'的入口点”-LMLPHP

这个问题有什么解决方案?

最佳答案

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

c# - 我不断收到“在DLL'user32.dll'中找不到名为'GetWindowLongPtrA'的入口点”-LMLPHP

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

c# - 我不断收到“在DLL'user32.dll'中找不到名为'GetWindowLongPtrA'的入口点”-LMLPHP

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