С# PInvoking user32.dll в 64-битной системе

Неправильно ли вызывать user32.dll в 64-битной Windows из 64-битного приложения? Я делал это успешно несколько раз и никогда не сталкивался с ошибкой, но это кажется противоречивым. Должен ли я вместо этого искать user64.dll?


person James Cadd    schedule 08.10.2009    source источник


Ответы (2)


Имя user32.dll вводит в заблуждение. Это 64-битная версия user32.dll, которую вы вызываете. 64-битная версия находится по адресу %windir%\System32\user32.dll.

32-разрядная версия включена для совместимости с 32-разрядными приложениями. Он находится по адресу %windir%\SysWOW64\user32.dll. Проверить их можно с помощью утилиты dumpbin:

System32\user32.dll:

FILE HEADER VALUES
        8664 machine (x64)

SysWOW64\user32.dll:

FILE HEADER VALUES
         14C machine (x86)
person mmx    schedule 08.10.2009
comment
Сейчас это вводит в заблуждение, но изначально он был назван так, чтобы различать 16 и 32 бита, не так ли? Но вряд ли они смогут изменить название, это слишком многое сломает... - person Matthew Scharley; 09.10.2009
comment
Ага. Я отчетливо помню общие сбои защиты, вызванные USER.EXE в Windows 3.1 в дни моего детства. - person mmx; 09.10.2009
comment
Должен любить, как каталог System32 все еще называется в 64-битных окнах :-) - person Justin; 09.10.2009

Нет user64.dll по той же причине, которую вы только что описали, программа .NET может быть независимой от архитектуры ЦП, поэтому один и тот же код должен работать на x86 и x64.
Если вы перенесете свою программу на платформу x86, она по-прежнему будет работать без каких-либо изменений.
Я думаю, что когда они назвали user32.dll, они не имели в виду эти сценарии.

person Shay Erlichmen    schedule 08.10.2009