初心者向けプログラミング解説になります。
今回は、C++で作成したDLLを、VB.NETのEXEで実行する手順までまとめましたので、ご参考ください。
前回のあらすじ
前回は、C++でDLLを作成したものを、C++のEXEで使ってみたところまで実践しました。
実践
今回は、C++でDLLを作成したものを、VB.NETのEXEで使ってみます。
※DLLは前回のをそのまま使います。
まぁ、文章見ててもしょうがないので、実際に動かしてみればいい。
exe(VB.NET)の作成手順
呼び側の作成(Windows フォーム アプリケーション(.NET Framework))になります。
- 新しいプロジェクトの作成→ 言語の種類「Visual Basic」を選択します。
- Windows フォーム アプリケーション(.NET Framework)
- プロジェクト名「vbapp_cdll」とします。
- 「構成マネージャー」を選択して「x64」を新規作成します。
(DLLは「x64」で作成しましたので、EXE側も「x64」で作成します。)
- 「x64」を選択した状態で
- 「開始」をクリックします。
- ビルドが実行され、のっぺらぼうの画面が表示されました。
- これで準備は整いました。「×」ボタンを押してForm1画面を閉じます。
- exeファイルと同じ場所(ここではvbapp_cdll > bin > x64 > Debug)に、dllファイルを置きます。
- フォームにボタンとラベルを追加します。
- ボタンをダブルクリックして以下プログラムを入力します。
- ボタンクリック時の処理
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Label1.Text = functest()
End Sub
- dll関数の定義は、大まかに2パターンあります。
どちらもdllの関数は呼べます。お好みで。 - 1つ目の方法
Private Declare Function functest Lib "cdll.dll" () As Integer
- 2つ目の方法
<System.Runtime.InteropServices.DllImport("cdll.dll")>
Public Shared Function functest() As Integer
End Function
- 「開始」ボタンで実行します。
- 「Button1」ボタンをクリックすると、ラベルに「10」と表示されます。
もし、こんなエラーが出たら1
指定されたモジュールが見つかりません。 (0x8007007E)
このエラーが出たら、dllファイルがexeと同じ場所に置いていないと表示されます。
上記の手順通り実施していれば、このエラーは出ません。
もし、こんなエラーが出たら2
間違ったフォーマットのプログラムを読み込もうとしました。 (0x8007000B)
このエラーが出たら、dllとexeが、両方とも64ビット(x64)になっていないと表示されます。
上記の手順通り実施していれば、このエラーは出ません。
もし、こんなエラーがでたら3
DLL ‘cdll.dll’ の ‘functest’ というエントリ ポイントが見つかりません。
dll側のエクスポートがうまくいっていないのが原因になります。
functest()が本当に定義されているか。
前回、C++のexeでお試し済みなら、これは無いですね。
「extern “C”」を使っているか、もしくは、defファイルを作成してビルドしているか。
これは、どちらもやってません。「extern “C”」のほうが簡単で、今後追加したときの漏れの心配もないので、こちらを採用します。
cdll.hを以下のように修正しました。
#pragma once
#ifndef __CDLL_H
#define __CDLL_H
extern "C" {
#ifdef CDLL_EXPORTS
#define CDLL_API __declspec(dllexport)
#else
#define CDLL_API __declspec(dllimport)
#endif
CDLL_API int WINAPI functest(void);
}
#endif
修正したdllファイルをexeと同じフォルダにコピーして(上書きして)、お試しください。
最後に
- 「Button1」ボタンをクリックすると、ラベルに「10」と表示されました。
以上で、C言語DLLを、VB.NETのEXEで使用する方法になります。
構成マネージャーを「Debug」で進めましたが、納品するようなときは、「Release」でビルドしたファイルを渡しましょう。
ファイルサイズも小さくなって、いろいろ最適化されてますので、処理速度も上がります。
次回は、EXEの方を別の言語(C#)に変えて試した解説になりますのでこちらも是非チャレンジしてみてください。
最後まで見てくれてありがとう。