Требует ли P / Invoke в 64-битных окнах подписей, отличных от 32-битных?

StackOverflow https://stackoverflow.com/questions/1426286

  •  07-07-2019
  •  | 
  •  

Вопрос

Когда я создаю подпись, которая, например, ссылается на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top