2011-03-25 48 views
1

后来,我用ctypes编写了一个围绕商用DAQ库 的薄包装器。从那以后,我遇到了Cython,并且想给它一个去,并且认为它可能比我之前的 更好/更清晰。大部分的Cython文档都很有意义,我发现了大部分我知道的东西,但我打包的库高度依赖于窗口,并且与标准C/C + +代码有点不同,至少在远处我可以说。使用Cython编写针对困难C头文件的Python包装

以下是头文件中的一些片段,我确切地说不是 如何包装。


#ifndef DAQ_H 
#define DAQ_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

#if !defined(_DAQAPI32_) 
    #define DAQAPI __declspec(dllimport) 
#else 
    #define DAQAPI 
#endif 

从我所收集的,我大概可以忽略我用Cython 定义极本?我试着用gcc编译C代码,但它在每个函数定义时都会引发错误。用ctypes我直接访问了库,并没有使用头文件。


/* Handle Type Definition */ 
typedef INT DaqHandleT; 

/* Initialization and Locking Prototypes */ 
DAQAPI DaqHandleT WINAPI daqOpen(LPSTR daqName); 
DAQAPI DaqError WINAPI  daqClose(DaqHandleT handle); 
DAQAPI DaqError WINAPI  daqOnline(DaqHandleT handle, PBOOL online); 

/* Error Handler Type Definitions */ 
typedef VOID CALLBACK  DaqErrorHandlerFT(DaqHandleT handle, 
DaqError errCode); 
typedef DaqErrorHandlerFT *DaqErrorHandlerFPT; 

/* Error Handler Function Prototypes */ 
DAQAPI DaqError WINAPI daqSetDefaultErrorHandler(DaqErrorHandlerFPT 
handler); 
DAQAPI DaqError WINAPI daqSetErrorHandler(DaqHandleT handle, 
DaqErrorHandlerFPT handler); 
DAQAPI DaqError WINAPI daqProcessError(DaqHandleT handle, DaqError 
errCode); 
DAQAPI DaqError WINAPI daqGetLastError(DaqHandleT handle, DaqError 
*errCode); 
DAQAPI VOID CALLBACK daqDefaultErrorHandler(DaqHandleT handle, 
DaqError errCode); 
DAQAPI DaqError WINAPI daqFormatError(DaqError errorNum, PCHAR msg); 

这基本上是大多数功能是如何声明和操作。他们 只返回错误代码,所有重要信息摆脱它是 通过指针完成。我找不到文档 中有关如何使用指针返回类型的任何内容,我可能没有看到 够硬。

任何人都可以指向正确的方向包装这些 函数?

像DaqError这样的事实实际上是在头文件中声明的枚举, 他们在这个库中使用了大约1500行的enum enum疯狂。

感谢您的帮助,

回答

1

创建一个具有返回类型的用Cython的typedef。通过这种方式,cython将使用原始库的相同宏。

cdef extern from "header.h": 

    ctypedef void * win_api_t "DAQAPI DaqHandleT WINAPI" 
    win_api_t daqOpen(char*) 

cpdef pyDaqOpen(pystr): 
    daqOpen(pystr)