VBで使えるDLLの作成方法

VB Tips And Sample(HOME)


簡単な例の方が良いので
int Tasu(int x,int y)の関数を持つだけのDLLを作成します。
VC++6で作成します。

「Win32ダイナミックリンクライブラリ」編

●ウィザードで「Win32ダイナミックリンクライブラリ」のプロジェクトを作ります。
プロジェクト名を「makedll」とします。
ステップ1では「シンボルをエクスポートする」を選択しておきます。

FileViewでmakedll.hを次のように書き換えます。
以下が全行です。

#ifdef MAKEDLL_EXPORTS
#define MAKEDLL_API __declspec(dllexport)
#else
#define MAKEDLL_API __declspec(dllimport)
#endif

int MAKEDLL_API __stdcall Tasu(int x,int y);


makedll.cppの方は
以下が全行です。

#include "stdafx.h"
#include "makedll.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
    }
    return TRUE;
}

int MAKEDLL_API __stdcall Tasu(int x,int y)
{
return x+y;
}

とします。

makedll.defは以下のようにします。
テキストファイルで作成し、ファイル名をmakedll.defと変えておきます。
そしてこのファイルを忘れずにプロジェクトに追加しておきます。ファイルビューの所で「makedll ファイル」を右クリックしてから行えます。
以下が全行です。

LIBRARY makedll.DLL

EXPORTS
  Tasu


後はビルドするだけで、DLLが作成されます。
コピペして張り付けるとスペースが全角になっていますので半角に変えてくださいね。

●VBからは、VBのプロジェクトホルダにDLLをコピーしておき、標準モジュールで
Option Explicit
’Declare Function Tasu Lib "C:\Documents and Settings\makedll.dll" (ByVal a As Long, ByVal b As Long) As Long ’OSの種類によって完全パスが必要な場合があります。
Declare Function Tasu Lib "makedll.dll" (ByVal a As Long, ByVal b As Long) As Long


と定義して、適当なイベントハンドラで

Private Sub Command1_Click()
MsgBox Tasu(10, 100)
End Sub
と呼びだせれば成功です。

ここからサンプルをダウンロードできます。

MFCレギュラーDLL編


●新しく「Moto」プロジェクトで、CObjectクラスを親クラスにしたMydllクラスを作成して、次にその中に単純なTasuメンバ関数を追加する。
使用してみて、実行できればOK。

●次にこのMydllクラスのTasu関数をdllにする。
ここでは、MFCレギュラーDLLを作成する。
ウィザードで「MFCの共有〜」を選択すること。
名前を「makedll」プロジェクトにする。
先の「Moto」プロジェクトからMydll.h、Mydll.cppをコピーして「makedll」プロジェクトへ貼り付け、プロジェクトへ追加する。
FileViewにMydll.h、Mydll.cppが表示される。

Mydll.hからクラスの定義は全てコメントアウトして、全て関数に書き換える。

/*class Mydll :
public CObject
{
public:
Mydll(void);
~Mydll(void);
int Tasu(int x, int y);
};
*/
extern "C" int WINAPI EXPORT Tasu(int x,int Y);


Mydll.cppの方も書き換える。

#include "StdAfx.h"
/*Mydll::Mydll(void){}
Mydll::~Mydll(void){}
int Mydll::Tasu(int x, int y){ return x+y;}
*/
extern "C" int WINAPI EXPORT Tasu(int x,int y){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return x+y;
}


モジュール定義ファイルを作成する。
FileViewの中にmakedll.defがあるのでそれにエクスポートする関数を書き込む。

; makedll.def : DLL 用のモジュール パラメータ宣言
LIBRARY      "makedll"
DESCRIPTION  'makedll Windows Dynamic Link Library'
EXPORTS
    ; 明示的なエクスポートはここへ記述できます
Tasu


ビルドするとDLLが完成する。
コピペして張り付けるとスペースが全角になっていますので半角に変えてくださいね。
同時にlibファイルもできる。LibフィルもDllを使用する時に必要になるで注意すること。

●VC++6からDLLの使用方法。
ダイアログベースの雛形をウィザードで作成した後、一度ビルドしておく。
作成したDllファイル、libファイルを「Debug」フォルダに貼り付ける。
メニューから「プロジェクト」「プロジェクトへ追加」ダイアログで、ファイルの種類をlibにして、今貼り付けたlibファイルを追加する。
次に、Mydll.hも、コピーして貼り付ける。同じくプロジェクトへ追加する。
ヘッダーをインクルードする。(使うファイルのcppでインクルードしておく。)
#include "stdafx.h"
#include "VCUseDll.h"
#include "VCUseDllDlg.h"
#include "Mydll.h"

使用方法。
直にTasu関数を呼び出すことができます。
char ret[20];
sprintf(ret,"%d",Tasu(10,15));
AfxMessageBox(ret);

以上。

●VBから呼び出して使用する方法はWin32dllの呼び出しと同じである。
また、VB.netからも使うことができる。
その場合変数の取り扱いに注意する必要があり、Declare部分でLongとintなどの読み替え書き換えを行う。

サンプルでは、VCのプロジェクト名「mfcdll」、作成したdllファイル名が「mfcdll.dll」となっています。
読み替えてください。
ここからサンプルのダウンロードができます。


VB Tips And Sample(HOME)
3週間完全マスターVisual C++6.0
商品の詳細、ご購入はここから
3週間完全マスターVisual C++6.0
出版社 日経BP社
書かれている通りに作っていけばとりあえずはできます。
基本のダイアログベースから、マルチスレッド、DLLの作り方まで紹介されています。
辞書的に使用可。

残念ながら、新品はありません。でもすごく安く出品されています。