Est-ce que P / Invoke sur les fenêtres 64 bits nécessite des signatures différentes de celles sur 32 bits?

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

  •  07-07-2019
  •  | 
  •  

Question

Lorsque je crée une signature qui fait référence à user32.dll , par exemple, dois-je la construire avec user64.dll si la cible est un ordinateur 64 bits?

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(
    IntPtr hWndRemove,
    IntPtr hWndNewNext);

Actuellement, ce n'est pas un problème car je ne cible que le 32 bits en raison d'une bibliothèque d'un fournisseur (Progress OpenEdge) qui fournit uniquement des bibliothèques 32 bits pour accéder à leur base de données.

Je ne dispose pas actuellement d'un ordinateur Windows 64 bits pour savoir si c'est le cas.

Était-ce utile?

La solution

Malgré la convention de dénomination, user32.dll (et d'autres 32 ... dll) est en réalité 64 bits sur des ordinateurs 64 bits. Ce sont les noms historiques pour les dll et ont été conservés de cette manière, quelles que soient les modifications apportées à l'architecture sous-jacente. Lisez cette cette . page pour obtenir plus de détails.

Autres conseils

Vous devez ne pas modifier la signature / le nom de la DLL à laquelle vous créez un lien lorsque vous appelez des fonctions USER32.DLL.

Malgré la convention de dénomination, sur un ordinateur Windows 64 bits, le fichier USER32.DLL situé dans [Windows] \ System32 est en réalité une DLL 64 bits. La version réelle 32 bits de USER32.DLL se trouve en fait dans un dossier nommé [Windows] \ SysWow64.

Veuillez consulter cette question pour plus d'infos.

Les types de données que vous transmettez en tant que paramètres aux différentes fonctions de l’API Windows sont sans doute les plus prudents. Par exemple, le message "SendMessage". fonction dans USER32.DLL a une exigence spécifique avec au moins un de ses paramètres (selon le page sur P / Invoke ).

Sa signature est:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

et les notes 2 & amp; 3 ci-dessous indiquent clairement:

  

2) N'utilisez JAMAIS " int " ou "entier" comme   lParam. Votre code se bloquera sur 64 bits   les fenêtres. Utilisez UNIQUEMENT IntPtr, un " ref "   structure, ou un "out" structure.

     

3) N'utilisez JAMAIS "bool", "int", ou   " entier " comme valeur de retour. Votre   le noyau se plantera sur les fenêtres 64 bits.   SEULEMENT utiliser IntPtr. Ce n'est pas sécuritaire d'utiliser   bool - pInvoke ne peut pas rassembler un   IntPtr à un booléen.

Cette "mise en garde". semble être spécifique à cette fonction particulière (SendMessage), bien que ce soit quelque chose sur lequel je porterais une attention particulière lors de l'appel à toute fonction API Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top