VBからVCのDLLが呼び出せない

解決


ちょろねずみ  2006-12-22 03:27:12  No: 97505

初めまして。教えて下さい。

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 と表示されて
います。

以上、よろしくお願いします。


大吉末吉  2006-12-22 04:02:02  No: 97506

> 5. Dependency Walker でchoro.dll を開くと、choro.dllのアイコンは、
> ?印です。

なら、明らかに、そのDLLが「正常な状態に無い」のでは?

> [Time Stamp]列の下には、Invaid path or file name と表示されています。
そのDLLが、別のDLLを参照していて、参照先のDLLの「ファイルが見つからない」のとか・・・

#[Time Stamp]列の左側の[Module]列は、何になっています?


ちょろねずみ  2006-12-22 04:42:29  No: 97507

大吉末吉様

ご返答ありがとうございます。

>そのDLLが、別のDLLを参照していて、参照先のDLLの「ファイルが見つからない」のとか・・・
別のDLLとは?  GetNezumi()関数は、何もせずに return TRUE しているだけ
ですが... DebugビルドしたMFCレギュラーDLLなので、MFC42D.DLLと
MSVCRTD.DLL を参照するのでしょうか?

>[Time Stamp]列の左側の[Module]列は、何になっています?
何も表示されていません。空欄です。

以上、よろしくお願いします。


ちょろねずみ  2006-12-22 04:46:18  No: 97508

>[Time Stamp]列の左側の[Module]列は、何になっています?
訂正です。?印のアイコンのCHORO.DLLが表示されています。

以上、よろしくお願いします。


ちょろねずみ  2006-12-22 05:24:18  No: 97509

原因は、二つありました。

1. choro.dllのパスに日本語が含まれていた。
2. choro.dllのパスが通っていなかった。VB側のDeclare文でchoro.dllを
  フルパスで指定すると、GetNezumi()関数を呼び出せた。

以上


Blue  2006-12-22 18:18:29  No: 97510

>1.
パスに日本語が入っていても問題ないのでは?
>2.
パスさえ通っている場所(下記リンクを参考)におけば大丈夫なはずですが。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200611/06110025.txt


ちょろねずみ  2006-12-25 20:34:26  No: 97511

Blue様

ご返答ありがとうございます。

>パスに日本語が入っていても問題ないのでは?
はい、そうです。DLL内の関数の呼出には関係ありません。
ただ、Dependency Walker でchoro.dll を開くと、choro.dllのアイコンが、
?印で、[Time Stamp]列の下には、Invaid path or file name と表示されるのは、choro.dllの格納先パスに日本語が含まれていたためです。
VC++ 6.0 付属の英語版のDependency Walkerを使ったので、漢字が含まれる
パスが化けて表示されていました。

>パスさえ通っている場所(下記リンクを参考)におけば大丈夫なはずですが。
はい、そのとおりです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加