Я пытаюсь использовать GetWindowLongPtrA
но получаю сообщение "Невозможно найти точку входа с именем" GetWindowLongPtrA "в DLL" user32.dll "". (также 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
, GetWindowLongPtrA
или GetWindowLongPtrW
в 32-разрядной версии user32.dll
:
Причина, по которой использование GetWindowLongPtr
независимо от целевой битности работает на C и WinAPI-коде C++, заключается в том, что в 32-битном коде это макрос, который вызывает GetWindowLong(A|W)
. Он существует только в 64-битной версии user32.dll
:
Документация по импорту GetWindowLongPtr
на pinvoke.net включает пример кода для того, как сделать этот импорт прозрачным для целевой битности (помните, ошибка выдается, когда вы фактически пытаетесь вызвать импортированную функцию, которая не существует, а не в строке 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);
}