Я продолжаю получать сообщение «Невозможно найти точку входа с именем« GetWindowLongPtrA »в DLL« user32.dll »»

2

Я пытаюсь использовать 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.

Изображение 174551

Но на моем системном диске недостаточно свободного места. Это возможная причина? Изображение 174551

Каково решение этой проблемы?

  • 2
    Разве функция не называется GetWindowLongPtr? И я думаю, что если вы нацелены на 32-битный процесс, вы должны вызвать GetWindowLong.
  • 0
    Я пробовал GetWindowLongPtr, но тоже не работал. Да, GetWindowLong работал, но, учитывая, что моя система 64-битная, поэтому я думаю, что было бы лучше использовать GetWindowLong. Я пытался использовать GetWindowLongPtr, чтобы удалить кнопку «Развернуть и свернуть» из другого окна, но она не сработала (эти кнопки остались там), поэтому я думаю, что мне следует использовать версию «Ptr».
Показать ещё 5 комментариев
Теги:
pinvoke

1 ответ

4
Лучший ответ

Там нет функции с именем GetWindowLongPtr, GetWindowLongPtrA или GetWindowLongPtrW в 32-разрядной версии user32.dll:

Изображение 174551

Причина, по которой использование GetWindowLongPtr независимо от целевой битности работает на C и WinAPI-коде C++, заключается в том, что в 32-битном коде это макрос, который вызывает GetWindowLong(A|W). Он существует только в 64-битной версии user32.dll:

Изображение 174551

Документация по импорту 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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню