Требует ли P / Invoke в 64-битных окнах подписей, отличных от 32-битных?
Вопрос
Когда я создаю подпись, которая, например, ссылается на user32.dll
, следует ли создавать ее с помощью user64.dll
, если целью является 64-разрядный компьютер? р>
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(
IntPtr hWndRemove,
IntPtr hWndNewNext);
В настоящее время это не проблема, поскольку я нацеливаюсь только на 32-разрядную версию из-за библиотеки поставщика (Progress OpenEdge), которая предоставляет только 32-разрядные библиотеки для доступа к своей базе данных.
В настоящее время у меня нет компьютера с 64-разрядной операционной системой Windows, чтобы проверить, так ли это.
Решение
Несмотря на соглашение об именах, user32.dll (и другие 32 ... dll) на самом деле 64-битные на 64-битных машинах. Это исторические имена для dll, и они были сохранены таким образом, независимо от изменений в базовой архитектуре. Прочитайте этот страница, чтобы получить больше деталей.
Другие советы
Вам не нужно не изменять подпись / имя библиотеки DLL, на которую вы ссылаетесь при вызове функций USER32.DLL.
Несмотря на соглашение об именах, на 64-битной машине Windows файл USER32.DLL, который находится в [Windows] \ System32, на самом деле является 64-битной DLL. 32-разрядная версия real файла USER32.DLL фактически находится в папке [Windows] \ SysWow64.
См. этот вопрос для дополнительная информация.
Единственное, к чему вам, вероятно, следует быть особенно внимательным, это типы данных, которые вы передаете в качестве параметров различным функциям Windows API. Например, «SendMessage» Функция в USER32.DLL имеет специальное требование, по крайней мере, с одним из ее параметров (согласно страница в P / Invoke ).
Это подпись:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
и примечания 2 & amp; 3 ниже четко указано:
2) НИКОГДА не используйте " int " или "целое число" как LPARAM. Ваш код вылетит на 64-битной окна. Используйте ТОЛЬКО IntPtr, a "ref" структура, или "из" структура. р>
3) НИКОГДА не используйте "bool", "int" или & Quot; целое число & Quot; в качестве возвращаемого значения. Ваш ядро вылетит на 64-битных окнах. ТОЛЬКО используйте IntPtr. Это не безопасно использовать bool - pInvoke не может вывести IntPtr для логического значения.
Это "предостережение" похоже, специфичен для этой конкретной функции (SendMessage), хотя на это я бы обратил особое внимание при вызове любых функций Windows API.