DLL
内部からファイルを使用する最も簡単な方法は何Python
ですか?
具体的には、機能を公開するための追加のラッパーコードを記述せずに、これをどのように実行できますか?C++
Python
ネイティブPython
機能は、サードパーティのライブラリを使用するよりも強く推奨されます。
使いやすさのために、ctypesは行く方法です。
次のctypesの例は、私が(Python 2.5で)書いた実際のコードからのものです。これは、あなたが求めることを行うために私が見つけた最も簡単な方法です。
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
ものにはすべてのctypes
Cタイプのデータ型(、、、、int
など)がありchar
、値または参照を渡すことができます。私の例ではそうしていませんが、特定のデータ型を返すこともできます(HLL APIは、参照によって渡された変数を変更することによって値を返します)。short
void*
上記の特定の例に関して、IBMのEHLLAPIはかなり一貫性のあるインターフェースです。
IBMのドキュメントにあるように、すべての呼び出しは4つのvoidポインターを渡します(EHLLAPIは4番目のパラメーターを介して戻りコードを送り返します。これはint
soへのポインターです。戻りタイプとして指定しint
ますが、無視しても問題ありません)。言い換えると、関数のCバリアントは次のようになります。
int hllApi (void *p1, void *p2, void *p3, void *p4)
ctypes
これにより、EHLLAPIライブラリが提供するすべてのことを実行できる単一の単純な関数が作成されますが、他のライブラリでは、ctypes
ライブラリ関数ごとに個別の関数を設定する必要がある可能性があります。
からの戻り値WINFUNCTYPE
は関数プロトタイプですが、それでも(タイプに加えて)より多くのパラメーター情報を設定する必要があります。の各タプルにhllApiParams
は、パラメーター「方向」(1 =入力、2 =出力など)、パラメーター名、およびデフォルト値があります。詳細については、ctypes
ドキュメントを参照してください。
プロトタイプとパラメータの情報を入手したらhllApi
、関数を呼び出すためのPython「呼び出し可能」を作成できます。必要な変数を作成し(私の場合はp1
スルーp4
)、それらを使用して関数を呼び出すだけです。
このページには、DLL ファイルから関数を呼び出す非常に簡単な例があります。
完全を期すために、ここで詳細を言い換えます。
Python で DLL 関数を呼び出すのは非常に簡単です。私は 2 つの関数を持つ自作の DLL ファイルを持っています:
add
とsub
2 つの引数を取ります。
add(a, b)
2 つの数値の加算を返します 2 つの数値
sub(a, b)
の減算を返しますDLL ファイルの名前は「demo.dll」になります。
プログラム:
from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2
出力:
Addition value:11
Substraction:9
ctypes を使用して dll にアクセスできます。チュートリアルは次のとおりです。
たぶんDispatch
:
from win32com.client import Dispatch
zk = Dispatch("zkemkeeper.ZKEM")
zkemkeeper はシステムに登録されている DLL ファイルです...その後、関数を呼び出すだけで関数にアクセスできます。
zk.Connect_Net(IP_address, port)
ctypes は最も簡単に使用できますが、(誤って) 使用すると Python がクラッシュする可能性があります。あなたが何かを素早くやろうとしていて、注意を払っているなら、それは素晴らしいことです.
Boost Pythonをチェックすることをお勧めします。はい、いくつかの C++ コードを記述し、C++ コンパイラを使用する必要がありますが、実際にそれを使用するために C++ を学習する必要はなく、Microsoft から無料の (ビールのように) C++ コンパイラを入手できます。