Vous devez pas devez modifier la signature/le nom de la DLL que vous liez à lors de l'appel aux fonctions USER32.DLL.
Malgré la convention de dénomination, sur un ordinateur Windows 64 bits, le fichier USER32.DLL qui se trouve dans [Windows] \ System32 est en fait une DLL 64 bits. Le réel version 32 bits de USER32.DLL se trouve réellement dans un dossier appelé [Windows] \ SysWow64. Pour plus d'informations, veuillez consulter le this question.
La chose dont vous devrez probablement faire particulièrement attention est celle des types de données que vous transmettez en tant que paramètres aux diverses fonctions de l'API Windows. Par exemple, la fonction "SendMessage" dans USER32.DLL a une exigence spécifique avec au moins un de ses paramètres (selon le page on P/Invoke).
Il est la signature est:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
et note 2 ci-dessous & 3 clairement:
2) Ne JAMAIS utiliser "int" ou "entier" comme lParam. Votre code va planter sur Windows 64 bits . Utilisez UNIQUEMENT IntPtr, une structure "ref" , ou une structure "out".
3) N'utilisez JAMAIS "bool", "int", ou "entier" comme valeur de retour. Votre noyau va planter sur les fenêtres 64 bits. Utilisez UNIQUEMENT IntPtr. Il n'est pas sûr d'utiliser bool - pInvoke ne peut pas marshaler un IntPtr à un booléen.
Cette « mise en garde » semble être spécifique à cette fonction particulière (SendMessage), bien que ce soit quelque chose que je voudrais accorder une attention particulière au moment où la remise en toutes les fonctions de l'API Windows.
Mon Dieu merci, la façon dont cette page décrit comment les changements de vue des systèmes de fichiers entre les applications 64/32 bits est plutôt effrayant à voir. Merci beaucoup pour votre réponse Pete. –
De rien. Je suis heureux d'aider. –