如何使用python ctypes引用Structure中的Structure

时间:2015-01-28 10:12:57

标签: python c pointers structure ctypes

早上好, 我一直在寻找答案。我希望我没有尝试过错误的关键词。谢谢你的回答!这是我的问题:

我正在写一些概念证明代码。我有两个C结构。 StructureA有一个指向StructureB的指针。功能栏将值打印到控制台。我们的目标是在Python中初始化和使用结构体并将它们传递给共享库,这对结构体做了一些奇特的东西。

我认为我在Python中做错了。我尝试了几种方法,你可以在(Python-)主函数中看到。

此外,字符串的内容混淆了,但这不是我的主要问题。

这是我的C代码:

#define _DLL_H_ 
#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct StructureB {
    int Value1;
    char Value2[80];
} StructureB;

typedef struct StructureA {
    int ValueA;
    char ValueB[80];
    StructureB *ValueC;
} StructureA;

void bar(StructureA *ref){
    printf("ValueA: %d\n", ref->ValueA);
    printf("ValueB: %s\n", ref->ValueB);
    printf("Value1: %d\n", ref->ValueC->Value1);
    printf("Value2: %s\n", ref->ValueC->Value2);
}

#ifdef __cplusplus
}
#endif

这是我的Python代码:

#!/usr/bin/python

from ctypes import *
import sys

class StructureB(Structure):
   _fields_ = [('Value1', c_int),
               ('Value2', c_char_p)]

class StructureA(Structure):
   _fields_ = [('ValueA', c_int),
               ('ValueB', c_char_p),
               ('ValueC', POINTER(StructureB))]


def main(argv):
    lib = cdll.LoadLibrary("structures.dll")

    sub_struct = StructureB()
    sub_struct.Value1 = 42*42
    sub_struct.Value2 = c_char_p("Hello StructureB!")

    struct = StructureA()
    struct.ValueA = -42
    struct.ValueB = c_char_p("Hello StructureA!")

    #struct.ValueC = pointer(sub_struct)
    #struct.ValueC = cast(sub_struct, POINTER(StructureB))
    #struct.ValueC = addressof(StructureB)
    #struct.ValueC = pointer(StructureB)
    struct.ValueC = StructureB

    lib.bar(pointer(struct))

    print sub_struct.Value2
    print struct.ValueB

if __name__ == "__main__":
    main(sys.argv)

0 个答案:

没有答案