Я продолжаю получать сообщение "Невозможно найти точку входа с именем 'GetWindowLongPtrA' в DLL 'user32.dll'"
Я пытаюсь использовать 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.
Но на моем системном диске недостаточно свободного места. Это возможная причина?
Каково решение этой проблемы?
1 ответ
Там нет функции с именем GetWindowLongPtr
, GetWindowLongPtrA
или же GetWindowLongPtrW
в 32-битной версии user32.dll
:
Причина того, что с помощью GetWindowLongPtr
независимо от целевой битности работает C и C++ WinAPI-код в том, что в 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);
}