vb6で利用できるDLL作成についてご助言お願いいたします。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ARAJIN

vb6で利用できるDLL作成についてご助言お願いいたします。

#1

投稿記事 by ARAJIN » 10年前

初めて投稿させていただきます。

現在、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

ARAJIN

Re: vb6で利用できるDLL作成についてご助言お願いいたします。

#2

投稿記事 by ARAJIN » 10年前

解決いたしました。
原因は、2点あり、
 ①DLLを動作させる環境に、再配布パッケージが入っていない。
 ②DLLをビルドする際に、デバックモードでビルドしていた。

こちらは、
 ・vc++ 2010 再配布パッケージのインストール
 ・構成マネージャにて、Releaseをアクティブにする
以上で、動作することが確認できました。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る