SetWindowLong/GetWindowLong et 32-bit/64-bit Cpu
Je suis en utilisant le code suivant:
const int GWL_STYLE = (-16);
const UInt32 WS_POPUP = 0x80000000;
const UInt32 WS_CHILD = 0x40000000;
[DllImport("user32.dll", SetLastError = true)]
static extern UInt32 GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong);
et quelque part...
SetWindowLong(this.Handle, GWL_STYLE,
((GetWindowLong(this.Handle, GWL_STYLE) & ~(WS_POPUP)) | WS_CHILD));
Sera-ce s'exécuter correctement sur les versions 32 bits et 64 bits des machines?
Si pas, si je compiler mon application a fonctionné comme un x86 processus, sera-il encore fonctionner sur une machine 64 bits?
Et comment puis-je repasser le code suivant pour être OK dans les deux versions 32 bits et 64 bits des machines?
double possible de Comment puis-je pinvoke à GetWindowLongPtr et SetWindowLongPtr sur les plates-formes 32 bits? Hans réponse est excellente et spot-on, par habitude.
Double Possible de Comment puis-je pinvoke à GetWindowLongPtr et SetWindowLongPtr sur les plates-formes 32 bits?
Double Possible de Comment puis-je pinvoke à GetWindowLongPtr et SetWindowLongPtr sur les plates-formes 32 bits?
OriginalL'auteur | 2012-02-14
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous vous demandez si vous avez choisi le type UInt32 correctement. La réponse est oui. Les docs explicitement dire qu'il est toujours en 32 bits valeur: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs. 85).aspx
Votre code est correct.
SetWindowLongPtr
fonction. Pour écrire du code qui est compatible avec les versions 32 bits et les versions 64 bits de Windows, utilisez leSetWindowLongPtr
la fonction". Donc tout simplement d'avoir la déclaration deSetWindowLong
correct n'est pas suffisant pour les versions 64 bits de Windows.SetWindowLong fonctionne toujours très bien sur les plates-formes 64 bits aussi longtemps que vous n'êtes pas passer quelque chose qui est officiellement le pointeur de la taille (par exemple, les procédures de fenêtre).
Oui, mais le
SetWindowLong
fonction est faq, utilisé pour transmettre des choses comme des pointeurs... Cela me semble une bien meilleure idée d'écrire le code correctement le premier temps de sorte que vous n'ayez pas à vous soucier plus tard, lorsque vous décidez de réutiliser la même définition, mais cette fois de passer un pointeur.SetWindowLongPtr est une macro sur les plates-formes 32 bits de sorte que vous n'irez pas très loin en essayant de P/Invoke.
Vous avez cité "pour écrire du code qui est compatible avec les versions 32 bits et les versions 64 bits de Windows, utilisez le SetWindowLongPtr fonction". Je ne pense pas que c'est un tronçon d'imaginer quelqu'un en lisant cette citation dans un C#/pinvoke fil et de réflexion, vous prévu comme de bons conseils pour C#/pinvoke. Bien que vous ne l'avez pas, il pourrait facilement avoir été mal interprétée (et c'est évident, a été par ChrisV).
OriginalL'auteur usr