私は第三者から.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
誰もが、私を助けてくださいもらえますか? ご迷惑をおかけいたします。
ありがとうございました!
ヘッダーファイル、dllファイル、swigでは、Pythonラッパーを生成できますか? – bicepjai