2011-03-25 47 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)