Я продолжаю получать сообщение "Невозможно найти точку входа с именем '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);
}
Другие вопросы по тегам