python2.5问题中的Exception_Record

时间:2010-03-22 22:35:48

标签: python winapi

我正在使用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 个答案:

答案 0 :(得分:2)

显然,在定义类时不能引用类类型,例如:

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

答案 1 :(得分:2)

看起来你已经完成了from ctypes import *(糟糕的做法,因为人们可以猜测所有这些标识符,例如DWORD实际来自哪里! - )但错过了{{} {3}}:

  

可以定义字段   类之后的类变量   定义结构的语句   子类,这允许创建数据   直接或间接的类型   引用自己

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 :(得分:0)

类可以使用__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__