1

しばらく前に、ctypes を使用して商用 DAQ ライブラリのシン ラッパーを作成しました。それ以来、私は Cython に出くわし、それを試してみたいと思っていました。Cython のドキュメントのほとんどは理にかなっていて、私が知っていることのほとんどを見つけましたが、ラップしているライブラリは非常に Windows 固有であり、少なくとも私ができる限り、標準の C/C++ コードとは少し異なることを行います。教えて。

これは、ヘッダー ファイルからのいくつかのスニペットです。ラップする方法が正確にはわかりません。


#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 のようなものは、実際にはヘッダー ファイルで宣言された enum です。このライブラリでは、約 1500 行の enum に夢中になります。

助けてくれてありがとう、

4

1 に答える 1

1

returntypeを使用してcythontypedefを作成します。このようにして、cythonは元のライブラリと同じマクロを使用します。

cdef extern from "header.h":

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

cpdef pyDaqOpen( pystr ):
    daqOpen(pystr)
于 2011-03-29T06:38:11.753 に答える