早上好, 我一直在寻找答案。我希望我没有尝试过错误的关键词。谢谢你的回答!这是我的问题:
我正在写一些概念证明代码。我有两个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)