2009-06-17 11 views
1

Je n'arrive pas à faire fonctionner ce code, j'avais l'impression de le faire correctement.ctypes en Python 2.6 help

from ctypes import * 


kernel32 = windll.kernel32 

string1 = "test" 
string2 = "test2" 

kernel32.MessageBox(None, 
         string1, 
         string2, 
         MB_OK) 

** J'ai essayé de le changer à MessageBoxA comme suggéré ci-dessous ** ** erreur que je reçois :: **

Traceback (most recent call last): 
    File "C:\<string>", line 6, in <module> 
    File "C:\Python26\Lib\ctypes\__init__.py", line 366, in __getattr__ 
    func = self.__getitem__(name) 
    File "C:\Python26\Lib\ctypes\__init__.py", line 371, in __getitem__ 
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'MessageBoxA' not found 

Répondre

0

Le problème est que la fonction que vous essayez d'appeler n'est pas réellement nommé MessageBox(). Il existe deux fonctions, nommées MessageBoxA() et MessageBoxW(): la première prend des chaînes ANSI 8 bits et la dernière prend des chaînes Unicode (caractères larges) de 16 bits. En C, le symbole du préprocesseur MessageBox est #define d soit MessageBoxA ou MessageBoxW, selon que Unicode est activé ou non (en particulier, si le symbole _UNICODE est défini).

En second lieu, selon le MessageBox() documentation, MessageBoxA/W sont situés dans user32.dll, non kernel32.dll.

Essayez ceci (je ne peux pas le vérifier, puisque je ne suis pas en face d'une boîte de Windows pour le moment):

user32 = windll.user32 
user32.MessageBoxA(None, string1, string2, MB_OK) 
4

MessageBox est défini dans user32 pas kernel32, vous avez pas non plus MB_OK utiliser défini donc ce lieu

windll.user32.MessageBoxA(None, string1, string2, 1) 

aussi je recommande d'utiliser python win32 API isntead de celui-ci, car il a toutes les fonctions constantes et nommées

e dit: Je veux dire utiliser ce

from ctypes import * 

kernel32 = windll.kernel32 

string1 = "test" 
string2 = "test2" 

#kernel32.MessageBox(None, string1, string2, MB_OK) 
windll.user32.MessageBoxA(None, string1, string2, 1) 

même chose que vous pouvez faire en utilisant win32 api comme

import win32gui 
win32gui.MessageBox(0, "a", "b", 1) 
+0

Que voulez-vous dire? –

+0

Je voulais dire que vous utilisez mauvais dll, voir que j'ai mis code entier à nouveau avec la ligne –

+0

Oh je parlais de la Win32 api pense, je ne savais pas que c'était un lien: pp –

0

Oh, et quand vous êtes confus au sujet si un besoin appel kernel32 ou user32 ou quelque chose des sortes. N'ayez pas peur de chercher l'appel sur MSDN. Ils ont un Alphabetical List et aussi une liste basée sur categories. J'espère que vous les trouverez utiles.

Questions connexes