初めまして。教えて下さい。
VB6のプログラムからVC++6で作成したMFCレギュラーDLLを呼ぶと、
「ファイルが見つかりません」エラーになります。
このDLLとVBのプログラムファイルは、同じ場所にあります。
1. VB側:
(1) サンプルコード
Public Declare Function GetNezumi Lib "choro.dll" () As Long
Sub test()
Dim lngRet As String
lngRet = GetNezumi()
End Sub
2. VC側:
(1)サンプルコード
extern "C" int WINAPI EXPORT GetNezumi()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// 通常関数の本体はこの位置にあります
return TRUE;
}
(2)プロジェクト名:choro
(3)DLLの種類: MFCレギュラーDLL
3. VBでのエラーメッセージの内容
「実行時エラー'53':
ファイルが見つかりません: choro.dll」
4. dumpbin /exports choro.dll の実行結果は以下のとおりです。
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file choro.dll
File Type: DLL
Section contains the following exports for choro.dll
0 characteristics
45892297 time date stamp Wed Dec 20 20:46:31 2006
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001019 GetNezumi
Summary
2000 .data
1000 .idata
1000 .rdata
1000 .reloc
1000 .rsrc
13000 .text
5. Dependency Walker でchoro.dll を開くと、choro.dllのアイコンは、
?印です。[Time Stamp]列の下には、Invaid path or file name と表示されて
います。
以上、よろしくお願いします。
> 5. Dependency Walker でchoro.dll を開くと、choro.dllのアイコンは、
> ?印です。
なら、明らかに、そのDLLが「正常な状態に無い」のでは?
> [Time Stamp]列の下には、Invaid path or file name と表示されています。
そのDLLが、別のDLLを参照していて、参照先のDLLの「ファイルが見つからない」のとか・・・
#[Time Stamp]列の左側の[Module]列は、何になっています?
大吉末吉様
ご返答ありがとうございます。
>そのDLLが、別のDLLを参照していて、参照先のDLLの「ファイルが見つからない」のとか・・・
別のDLLとは? GetNezumi()関数は、何もせずに return TRUE しているだけ
ですが... DebugビルドしたMFCレギュラーDLLなので、MFC42D.DLLと
MSVCRTD.DLL を参照するのでしょうか?
>[Time Stamp]列の左側の[Module]列は、何になっています?
何も表示されていません。空欄です。
以上、よろしくお願いします。
>[Time Stamp]列の左側の[Module]列は、何になっています?
訂正です。?印のアイコンのCHORO.DLLが表示されています。
以上、よろしくお願いします。
原因は、二つありました。
1. choro.dllのパスに日本語が含まれていた。
2. choro.dllのパスが通っていなかった。VB側のDeclare文でchoro.dllを
フルパスで指定すると、GetNezumi()関数を呼び出せた。
以上
>1.
パスに日本語が入っていても問題ないのでは?
>2.
パスさえ通っている場所(下記リンクを参考)におけば大丈夫なはずですが。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200611/06110025.txt
Blue様
ご返答ありがとうございます。
>パスに日本語が入っていても問題ないのでは?
はい、そうです。DLL内の関数の呼出には関係ありません。
ただ、Dependency Walker でchoro.dll を開くと、choro.dllのアイコンが、
?印で、[Time Stamp]列の下には、Invaid path or file name と表示されるのは、choro.dllの格納先パスに日本語が含まれていたためです。
VC++ 6.0 付属の英語版のDependency Walkerを使ったので、漢字が含まれる
パスが化けて表示されていました。
>パスさえ通っている場所(下記リンクを参考)におけば大丈夫なはずですが。
はい、そのとおりです。
ツイート | ![]() |