2012-04-09 51 views
1

私は第三者から.libと.hファイルとともに提供されるDLLを持っています( "test.dll"、 "test .lib "と" test.h ")SWIGとPythonを使用してサードパーティの.dll共有ライブラリから関数にアクセスする

このDLLには、Pythonスクリプトからアクセスする必要のある関数がいくつか含まれています。 このためには、SWIGとMSVC2010を使って拡張子(.pyd)を構築する必要があります。 (私はMSVCプロジェクトのディレクトリにサードパーティのファイルをコピーします)

"test.h"ファイルの概要を知るには、これはどのように見えますか(簡単にするために、 "CreateFile() 」、)ファイルハンドルを返す:私は(に実装これらのサードパーティの機能をラップするクラスを作るつもり

/* File : test.h */ 

#if !defined (TEST_H) 
     #define TEST_H 

#if defined (_MSC_VER) 
    #pragma warning(disable: 4103) 
    #pragma pack(push, 8) 
#elif defined (__BORLANDC__) 
    #pragma option push -a8 
    #pragma nopushoptwarn 
    #pragma nopackwarning 
#endif 

#include <wtypes.h> 

/*---------------------------------------------------------------------------- 
| BL API 
-----------------------------------------------------------------------------*/ 
#if defined (DLL_EXPORTS) 
    #define BLAPI(ret)      ret __stdcall 
#else 
    #define BLAPI(ret) __declspec(dllimport) ret __stdcall 
#endif 

/*---------------------------------------------------------------------------- 
| API 
-----------------------------------------------------------------------------*/ 
#if defined (__cplusplus) 
extern "C" { 
#endif 

BLAPI(HANDLE) CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess); 

#if defined (__cplusplus) 
} 
#endif 


/*---------------------------------------------------------------------------- 
| 
-----------------------------------------------------------------------------*/ 

#if defined (_MSC_VER) 
    #pragma pack(pop) 
#elif defined (__BORLANDC__) 
    #pragma option pop 
    #pragma nopushoptwarn 
    #pragma nopackwarning 
#endif 

#endif // TEST_H 

『TEST.DLL』ライブラリー)。 "myInterface.h" ファイルは、次のようになります、SWIGを使用するには

/* File : myInterface.cxx */ 

#include "myInterface.h" 
#include "test.h"   // <--- third party header 
#include <windows.h> 

BOOL myInterfaceClass::OpenFile(LPCTSTR lpFileName) 
{ 
    errorCode = TRUE; 
    // open file 
    hFile = CreateFile(lpFileName, GENERIC_READ); // <--- third party function call 
    errorCode = (INVALID_HANDLE_VALUE == hFile); 

    return errorCode; 
} 

/* File : myInterface.h */ 

#include <windows.h> 
#include "test.h"   // <--- third party header 

class myInterfaceClass { 
public: 
    myInterfaceClass() { 
    } 

    virtual ~myInterfaceClass() { 
    }; 

    HANDLE hFile; 
    BOOL errorCode; 

    BOOL OpenFile(LPCTSTR lpFileName); // <-- function wrapper 

}; 

...とクラスの実装、私は "myInterface.cxx" ファイルに入れて>「コマンド - 私は「カスタムツールを構築する」を置くこの.iファイルの「プロパティ」で、MSVCプロジェクトで

/* File : myInterface.i */ 
%module myInterface 

%{ 
#include "myInterface.h" 
#include "test.h" 
%} 

/* Let's just grab the original header file here */ 
%include "myInterface.h" 
%include "test.h" 

:私はMSVCプロジェクトに以下のSWIGインタフェースファイル.Iを追加する必要がありますライン "、以下:

echo PYTHON_INCLUDE: %PYTHON_INCLUDE% 
echo PYTHON_LIB: %PYTHON_LIB% 

rem 
rem WARNING!: Use quotes (" ") on path names to avoid errors ! 
rem 

echo on 
echo. 
echo. "%(FullPath)" 
echo. 
"%SWIG_PATH%\swig.exe" -c++ -python -I%SWIG_PATH%\lib -Itest "%(FullPath)" 

OK!私はPYDの拡張子を構築しようとした際 は、私はこのエラーが持っている:

Error 1 error : Syntax error in input(1). D:\ADXWorkZone\testSwig\test.h 33 1 myInterface 

を...しかし、「TEST.H」ファイルには何の問題もありません。私は同じファイルを(何も変更せずに)古典的なDLLと同じC++ラッパークラスを実装するために使用し、うまく動作します。

プロジェクトスペック:

Properties -> C/C++ -> General -> Additional Include Directories: $(PYTHON_INCLUDE) 
Properties -> Linker -> General -> Output File: _myInterface.pyd 
Properties -> Linker -> Input -> Additional Dependencies: $(PYTHON_LIB);test.lib 

誰もが、私を助けてくださいもらえますか? ご迷惑をおかけいたします。

ありがとうございました!

+0

ヘッダーファイル、dllファイル、swigでは、Pythonラッパーを生成できますか? – bicepjai

答えて

5

インターフェイスファイルに他の%includeを追加する前に、以下を追加してください。

%include <windows.i> 

SWIGを含み、これはそうでなければSWIGを混同するようBOOLと_declspecなどの定義を提供ネストに再帰ありません。

+0

**あなたは男です!ありがとうございます!**それは動作します!すばらしいです!何のためにも苦労して二日間。私はそれがSWIGインターフェースからのものだと知っていましたが、私はどこから来たのか分かりません。今、私は... :)ありがとう! – roadx

+0

あなたは大歓迎です!それがあなたに役立った場合、その答えをチェックすることを忘れないでください。 –

+0

私は彼が忘れたと思う.... – Jiminion

関連する問題