C言語DLLダイナミックリンクライブラリを作成し、VBとPythonでそれぞれ呼び出す


筆者が使用しているプログラミング環境はVisual Stdio 2010のVisual C+、コンパクト版Visual Basic 6.0、IDLEです.
2つの数の大きな値を求めるDLLをC言語で記述した例を示した.
 
——————————————————————————————————————————————
 
まずVS 2010-->新規プロジェクト-->Win 32-->Win 32プロジェクト-->自分の好きなプロジェクト名を入力し(筆者が入力したのはMakeDll)、プロジェクトを保存するパスを選択-->確定.
 
アプリケーション設定-->アプリケーション型に適用-->DLL(D)-->追加オプション->空のアイテム(E)を選択します.
 
次に「OK」をクリックしてプロジェクトワークウィンドウの下に入ります.
 
——————————————————————————————————————————————
DLLの作成を開始します.
 
ステップ1:
ヘッダソリューションエクスプローラ-->ヘッダファイル-->右クリック-->新規アイテムの追加-->ヘッダファイル(.h)の選択-->ファイル名の入力(筆者が入力したのはmax)-->追加(A)
 
max.hヘッダファイルのコードは:
 
#ifndef _MAX_H
#define _MAX_H_

__declspec(dllexport) int __stdcall fmax(int a,int b);

#endif

 
__declspec(dllexport)の役割は、この関数をDLL関数としてエクスポートすることを指定することである.
__stdcallは、DLL関数がC/C++以外の言語で呼び出されることを示す関数呼び出し規則である.
 
 
ステップ2:
最初の「ソリューションエクスプローラ」-->ソースファイル-->右クリック-->新規アイテムの追加-->「C++ファイル(.cpp)」を選択-->ファイル名を入力(筆者が入力したのはmax.c)-->追加(A)
 
max.cソースファイルのコードは次のとおりです.
 
#include"max.h"

int __stdcall fmax(int a,int b)
{
 return a>b?a:b;
}


このソースファイルの下には、自分で定義したヘッダファイル「max.h」を含め、2つのサイズを比較する関数fmax()を定義し、この関数の前に関数の呼び出しを__と宣言します.stdcallタイプ; 
 
ステップ3:
最初のソリューションエクスプローラ-->ソースファイル-->右クリック-->新規アイテムの追加-->モジュール定義ファイル(.def)の選択-->ファイル名の入力(筆者が入力したのはmax.def)-->追加(A)
 
max.defの役割はDLLを導出するための関数である.
max.defモジュールファイルのコードは次のとおりです.
 
LIBRARY MakeDll

EXPORTS 
	fmax @1

「LIBRARY」の役割は、リンクにDLLの名前を付ける方法を教えることですが、dllの名前を生成するのではなく、lib接続dllの名前に影響を与えるだけです.
EXPORTS文の役割は、エクスポートされた関数またはデータからなるセクションを導入することです.
fmax@1はシーケンス番号で導くことを指定します.
 
プロジェクトのスクリーンショット:
 
ステップ4:
F 5を押してデバッグまたはダイレクトメニューバーを開始-->生成-->MakeDll(U)を生成します.これは、生成に成功することを示す場合、プロジェクトを保存するパスの下の「Debug」フォルダの下で、生成に成功したMakeDllを見つけることができます.dllダイナミックリンクライブラリファイル
 
以上、C言語で簡単なDLLを作成する方法について説明するが、VC++6では基本的に同じ方法で作成されている.次に、VBとPythonで呼び出す方法について説明する.
 
——————————————————————————————————————————————
VBで呼び出す:
 
まずVBプロジェクトを新規作成し、「標準EXE」を選択
オブジェクトウィンドウでは、図のようなインタフェース、ラベル、3つのテキストボックス、ボタンを設計します.
 
コントロールの名前はデフォルト値を使用しています.コードウィンドウのコードは次のとおりです.
 
Private Declare Function fmax Lib "D:\Develop\Project\VB\MakeDll\Debug\MakeDll.dll" _
(ByVal inta As Integer, ByVal intb As Integer) As Integer     '  DLL  

Private Sub Command1_Click()
    Dim a As Integer, b As Integer
    a = Text1.Text
    b = Text2.Text
    Text3.Text = fmax(a, b) '  MakeDll.dll
End Sub

コードウィンドウのスクリーンショット:
 
OK、完了、以下「F 5」を押して運転を開始し、正しいフォーマットの数値を入力し、「比較」をクリックして、結果を見てみましょう.
 
Very well !VB呼び出しに成功しました.
 
——————————————————————————————————————————————
 
Pythonで呼び出す:
 
PythonでDLLを呼び出すのは簡単です.Pythonにはモジュールctypesが内蔵されており、簡単にこの作業を完了することができます.
IDLE-->File-->New Windowを開き、コードウィンドウに次のコードを入力します.
#!/user/bin/python
# _*_ coding: cp936 _*_

import ctypes

mydll=ctypes.windll.LoadLibrary("D:\Develop\Project\VB\MakeDll\Debug\MakeDll.dll")

a=17
b=25

print "    :",mydll.fmax(a,b)

DLLを書くときにMakeDllにdllの呼び出し規則は_stdcallなので、dllをロードする方法は次のとおりです.
ctypes.windll.LoadLibrary("dllpath")
または
ctypes.WinDLL("dllpath")
 
次に、保存、実行
実行結果:
IDLE 2.6.7      
>>> ================================ RESTART ================================
>>> 
    : 25
>>> 

OK、PythonはMakeDllを呼び出します.dll成功!
 
——————————————————————————————————————————————
 
 
 
筆者:転載を歓迎します.転載は出典を明記してください.