Python からカスタムの DLL を利用する

ここでは Windows 上で利用できる簡単な DLL を作成して、その中の関数を Python スクリプトから呼び出す方法を紹介します。

Windows での DLL の作り方についてはこのページでもソースコードは紹介しますが、「単純な DLL の作成 なども参考にしてください。

Python から自前の C 関数を呼べるようになれば、多くの Windows API を簡単に利用できるようになるので、Python でのプログラミングの幅が広がりますね。

Windows での DLL の作成方法

Windows SDK をインストールすると開発ツールや必要なヘッダファイルやライブラリが揃います。次の手順で DLL を作成してください。

次の内容を testdll1.cpp として保存します。

void foo1(int* i) {
	*i += 1;
	return;
}

次の内容を testdll1.h として保存します。

#pragma once 

void foo1(int* i);

次の内容を testdll1.def として保存します。

LIBRARY testdll1

EXPORTS
	foo1

次の内容を makefile とします。

TARGETNAME=testdll1
DEFFILE=testdll1
OUTDIR=.\chk

ALL : "$(OUTDIR)\$(TARGETNAME).dll"


"$(OUTDIR)" :
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

CPP_PROJ=\
	/MT\
	/W4\
	/Fo"$(OUTDIR)\\"\
	/Fd"$(OUTDIR)\\"\
	/c

LINK32=link.exe

LINK32_FLAGS=\
	/subsystem:windows\
	/pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\
	/debug\
	/RELEASE\
	/out:"$(OUTDIR)\$(TARGETNAME).dll"\
	/DLL\
	/DEF:$(DEFFILE).def

LINK32_OBJS= \
	"$(OUTDIR)\$(TARGETNAME).obj"

"$(OUTDIR)\$(TARGETNAME).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
    $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)

.cpp{$(OUTDIR)}.obj::
   $(CPP) $(CPP_PROJ) $<

Windows SDK のコマンドプロンプトから nmake とすることで、testdll1.dll が作成できるはずです。

開発環境の設定等については、Windows プログラミング入門 などを参考にしてください。

DLL を Python から利用する

上記で作成した testdll1.dll を次の Python スクリプト ctype2.py と同じフォルダに配置します。

from ctypes import *

mydll = cdll.testdll1

i = c_void_p(10)

print i.value

mydll.foo1(byref(i))

print i.value

実行結果は次の通り。

> python ctypes2.py
10
11

上で作成した関数 foo1 では int のポインタを受け取って、値をインクリメントしています。

Python スクリプトからポインタを渡すために、c_void_p のインスタンスを作成して、それを byref を用いて関数に渡しています。

関数へ整数を参照渡ししているので、関数の中で値がインクリメントされたことが確認できました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門