2010-03-22 3 views
1

J'utilise Python2.5 & le code suivant produire 2 erreurs. Est-ce que n'importe quel corps peut m'aider?Exception_Record dans le problème python2.5

class EXCEPTION_RECORD(Structure): 
    _fields_ = [ 
     ("ExceptionCode", DWORD), 
     ("ExceptionFlags", DWORD), 
     ("ExceptionRecord", POINTER(EXCEPTION_RECORD)), 
     ("ExceptionAddress", LPVOID), 
     ("NumberParameters", DWORD), 
     ("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)] 

erreur Python:

Traceback (most recent call last): 
    File "E:\Python25\my_debugger_defines.py", line 70, in <module> 
    class EXCEPTION_RECORD(Structure): 
    File "E:\Python25\my_debugger_defines.py", line 74, in EXCEPTION_RECORD 
    ("ExceptionRecord", POINTER(EXCEPTION_RECORD)), 
NameError: name 'EXCEPTION_RECORD' is not defined 

Microsoft Document:

The EXCEPTION_RECORD structure describes an exception. 

typedef struct _EXCEPTION_RECORD { // exr 
    DWORD ExceptionCode; 
    DWORD ExceptionFlags; 
    struct _EXCEPTION_RECORD *ExceptionRecord; 
    PVOID ExceptionAddress; 
    DWORD NumberParameters; 
    DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; 
} EXCEPTION_RECORD; 

Merci à l'avance

Répondre

2

On dirait que vous avez fait un from ctypes import * - mais a raté un court passage crucial dans ctypes.Structure's docs (pratique terribles, comme on est réduit à deviner où tous ces identifiants comme DWORD sont en fait viennent!):

It is possible to define the fields class variable after the class statement that defines the Structure subclass, this allows to create data types that directly or indirectly reference themselves:

class List(Structure): 
    pass 
List._fields_ = [("pnext", POINTER(List)), 
       ... 
       ] 

The fields class variable must, however, be defined before the type is first used (an instance is created, sizeof() is called on it, and so on). Later assignments to the fields class variable will raise an AttributeError.

Ainsi, la simple application de ce bit des documents à votre code, vous devez changer ce code dans:

class EXCEPTION_RECORD(Structure): 
    pass 
EXCEPTION_RECORD._fields_ = [ 
     ("ExceptionCode", DWORD), 
     ("ExceptionFlags", DWORD), 
     ("ExceptionRecord", POINTER(EXCEPTION_RECORD)), 
     ("ExceptionAddress", LPVOID), 
     ("NumberParameters", DWORD), 
     ("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)] 
2

Apparemment, vous ne pouvez pas faire référence à un type de classe tout en définissant une classe, par exemple:

>>> class C: 
    f = C 



Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    class C: 
    File "<pyshell#17>", line 2, in C 
    f = C 
NameError: name 'C' is not defined 

Cependant, vous pouvez contourner ce problème en faisant ceci:

>>> class C: 
    pass 

>>> C.f = C  

je serais récrire votre code comme suit:

class EXCEPTION_RECORD(Structure): 
    pass 

EXCEPTION_RECORD._fields_ = [ 
     ("ExceptionCode", DWORD), 
     ("ExceptionFlags", DWORD), 
     ("ExceptionRecord", POINTER(EXCEPTION_RECORD)), 
     ("ExceptionAddress", LPVOID), 
     ("NumberParameters", DWORD), 
     ("ExceptionInformation", ULONG_PTR * EXCEPTION_MAXIMUM_PARAMETERS)] 
0

Une classe peut se référencer dans les __new__ ou __init__ méthodes .

class Test(object): 
    def __new__(cls): 
     inst = object.__new__(cls) 
     inst.me = Test 
     return inst 

ou:

class Test(object): 
    def __init__(self): 
     super(Test, self).__init__() 
     self.me = Test 

Ou, si vous voulez vraiment obtenir la fantaisie, vous pouvez utiliser un __metaclass__.

Questions connexes