- - PR -
VBからVCのDLLが呼び出せない
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-20 18:43
初めまして。教えて下さい。
VB6のプログラムからVC++6で作成したMFCレギュラーDLLを呼ぶと、 「ファイルが見つかりません」エラーになります。 VBのプログラムファイルとこのDLLは、同じ場所にあります。 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" __declspec( dllexport) int WINAPI GetNezumi() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 通常関数の本体はこの位置にあります return TRUE; } (2)プロジェクト名:choro (3)DLLの種類: MFCレギュラーDLL 3. VBでのエラーメッセージの内容 実行時エラー'53': ファイルが見つかりません: choro.dll 以上、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-12-21 09:39
その DLL は、どこに置いてありますか?
| ||||||||||||
|
投稿日時: 2006-12-21 09:50
同じ場所だそうです。
http://www.geocities.jp/i_love_balard/myhome/vbdll.html _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-12-21 10:45
ファイルが見つからない場合も、メソッド名を誤っている場合も同じ「実行時エラー'53': 」になります。ですのでまずはDLLがエクスポートしている名前が間違いなくVBで宣言している名前に一致していることを確認してください。Function@12のような名前でエクスポートされている事がままあります。本当はdeclspecではなく、DEFファイルを定義したほうが良いです。
DLLを配置しているパスに気をつけてください。OSは実行ファイル(プロセス)と同じパスに配置されているDLLを読み込みます。開発環境上で実行している場合、VB6.EXEのプロセスで動作するので、実行ファイルと同じ場所と言うなら"C:\\Program Files\\Microsoft Visual Studio\\..."に配置する必要があります。(^^;素直にパスをきる方が良いです。 | ||||||||||||
|
投稿日時: 2006-12-21 11:21
甕星さん、ご返答ありがとうございます。
昨晩にググっていて、他所の掲示板でその事を発見しました。declspecはやめてdef ファイルでexportするように変更しました。しかし、現象は同じです。 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 次に、Dependency Walker でchoro.dll を開くと次のエラーメッセージが表示され ました。 「Dependency Walker External Viewer Error Error excuting "C:\WINDOWS\system32\viewers\quikview.exe" "c:\test\CHORO.DLL"」 choro.dllのアイコンは、?印です。choro.dll が正しく作成されていないのでしょうか? ちなみに、Dependency Walker で他のDLLを開くと正常に表示されます。 | ||||||||||||
|
投稿日時: 2006-12-21 11:24
\(◎o◎)/! 失礼しましたm(_ _)m | ||||||||||||
|
投稿日時: 2006-12-21 20:26
解決しました。原因は、二つありました。
1. choro.dllのパスに日本語が含まれていた。 2. choro.dllのパスが通っていなかった。VB側のDeclare文でchoro.dllを フルパスで指定すると、GetNezumi()関数を呼び出せた。 以上 | ||||||||||||
|
投稿日時: 2006-12-21 21:20
VB側でフルパス指定しなくても出来ると思いますけど。 Windows の systemディレクトリに置いたりして出来ないですか? (要は、環境変数PATH の設定がなされているディレクトリ) |