初めて投稿させていただきます。
現在、VB6(SP6)で実行できるDLLを作成しております。
開発環境は、
OS:Windows7(x86)
IDE:Visual Studio 2010 Professional
言語:C++
ひとまず、サンプルをと思い、簡単なDLLを作成してみたのですが、VB6にてDeclareで関数をコールすると、
「実行時エラー '53'」 ファイルが見つかりません。 となります。
実際ファイルがあるのは、確認しています。
私なりに色々と調査し、エクスポートの装飾名などに問題があるのではないかと思い、dumpbinにて参照したところ、
「関数名 = @ILT+240... 」 のような物になっていました。
一応 extern "C" __declspec(dllexport) や DEF ファイルを利用して、ビルドしても同じ結果でした。
VC++6.0で上記と同じようにDLLを作成し、コンパイルしたところ、問題なく動作することが確認できました。
ちなみに、こちらのdumpbinには、
「関数名=」というものはなく、関数名のみで完結していました。
上記を踏まえ、考えられることとしたら、VC++2010のコンパイルオプションの問題ではないかと考えています。
実際に作成されたことのある方や、有識者の方、ご教授いただけないでしょうか。
作成したサンプルは、作成手順及びソースは以下の通りです。
[VC++2010]
新しいプロジェクト → Win32オブジェクト → アプリケーションの種類(DLL) → 空のプロジェクトにチェック
[SampleDLL.h]
#ifdef __cplusplus
#define DLLAPI extern "C" __declspec(dllexport)
#else
#define DLLAPI __declspec(dllexport)
#endif
DLLAPI int __stdcall Tasu(int, int);
[SampleDLL.cpp]
#include "SampleDLL.h"
DLLAPI int __stdcall Tasu(int a, int b) {
return a + b;
}
[SampleDLL.def]
LIBRARY "SampleDLL"
EXPORTS
Tasu @1
プロジェクトプロパティ → リンカー → 入力 → モジュール定義ファイル → SampleDLL.def
※そのほかは、デフォルトです。
上記の状況でビルドした、DLLのdumpbin
----------------------------------------------------------------------------
ordinal hint RVA name
1 0 00011078 Tasu = @ILT+115(_Tasu@8)
----------------------------------------------------------------------------
この場合に、name項目の、Tasu = @ILT+115(_Tasu@8) の@以降は、必ず付くものなのでしょうか?
VB6のエラーは、関数名が原因かと思ったのですが・・・
VC++6.0で作成した際は、dumpbinでnameには、Tasuのみの表示で、VB6からもエラーもなく実行
できました。
[VB6]
Option Explicit
Private Declare Function Tasu Lib "SampleDLL" (ByVal v1 As Long, ByRef v2 As Long) As Long
Private Sub Command1_Click()
Dim a As Long
Dim b As Long
Dim c As Long
Dim ss As String
ss = Dir("SampleDLL.dll") ← ここで、DLLが存在することは、確認できています。
MsgBox ss
a = 10
b = 15
c = Tasu(a, b)
MsgBox c
End Sub
vb6で利用できるDLL作成についてご助言お願いいたします。
Re: vb6で利用できるDLL作成についてご助言お願いいたします。
解決いたしました。
原因は、2点あり、
①DLLを動作させる環境に、再配布パッケージが入っていない。
②DLLをビルドする際に、デバックモードでビルドしていた。
こちらは、
・vc++ 2010 再配布パッケージのインストール
・構成マネージャにて、Releaseをアクティブにする
以上で、動作することが確認できました。
ありがとうございました。
原因は、2点あり、
①DLLを動作させる環境に、再配布パッケージが入っていない。
②DLLをビルドする際に、デバックモードでビルドしていた。
こちらは、
・vc++ 2010 再配布パッケージのインストール
・構成マネージャにて、Releaseをアクティブにする
以上で、動作することが確認できました。
ありがとうございました。