Exception_Record в проблеме с python2.5 - PullRequest
1 голос
/ 23 марта 2010

Я использую Python2.5 и следующий код выдает 2 ошибки. Может ли какое-нибудь тело помочь мне?

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

Ошибка 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:

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; 

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 23 марта 2010

Похоже, вы выполнили from ctypes import * (ужасная практика, так как каждый сводится к предположению, откуда все эти идентификаторы, такие как DWORD на самом деле берутся! -), но пропустил важный короткий отрывок в типах. Документы структуры :

Можно определить поля переменная класса после класса утверждение, которое определяет структуру подкласс, это позволяет создавать данные типы, которые прямо или косвенно ссылаться на себя :

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

переменная класса fields должна, однако, быть определенным до того, как тип впервые используется (экземпляр создан, вызывается sizeof () и так далее). Более поздние присвоения полям переменная класса поднимет AttributeError.

Итак, просто применяя этот бит документов к вашему коду, вам нужно изменить этот код на:

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 голосов
/ 23 марта 2010

Очевидно, что вы не можете ссылаться на тип класса при определении класса, например ::100100

>>> 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

Однако вы можете обойти это, выполнив следующее:

>>> class C:
    pass

>>> C.f = C    

Я бы переписал ваш код следующим образом:

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 голосов
/ 23 марта 2010

Класс может ссылаться на себя в методах __new__ или __init__.

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

или

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

Или, если вы действительно хотите стать фантазером, вы можете использовать __metaclass__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...