- PR -

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

投稿者投稿内容
ちょろねずみ
会議室デビュー日: 2006/12/20
投稿数: 7
お住まい・勤務地: 尼崎
投稿日時: 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/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-12-21 09:39
その DLL は、どこに置いてありますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 09:50
引用:

ひろれいさんの書き込み (2006-12-21 09:39) より:

その DLL は、どこに置いてありますか?


引用:

ちょろねずみさんの書き込み (2006-12-20 18:43) より:

VBのプログラムファイルとこのDLLは、同じ場所にあります。


同じ場所だそうです。

引用:

ちょろねずみさんの書き込み (2006-12-20 18:43) より:

VB6のプログラムからVC++6で作成したMFCレギュラーDLLを呼ぶと、


http://www.geocities.jp/i_love_balard/myhome/vbdll.html

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 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/20
投稿数: 7
お住まい・勤務地: 尼崎
投稿日時: 2006-12-21 11:21
甕星さん、ご返答ありがとうございます。

引用:

Function@12のような名前でエクスポートされている事がままあります。本当はdeclspecではなく、DEFファイルを定義したほうが良いです。



昨晩にググっていて、他所の掲示板でその事を発見しました。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/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-12-21 11:24
引用:

じゃんぬねっとさんの書き込み (2006-12-21 09:50) より:

同じ場所だそうです。


\(◎o◎)/! 失礼しましたm(_ _)m
ちょろねずみ
会議室デビュー日: 2006/12/20
投稿数: 7
お住まい・勤務地: 尼崎
投稿日時: 2006-12-21 20:26
解決しました。原因は、二つありました。

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

以上
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-12-21 21:20
引用:

ちょろねずみさんの書き込み (2006-12-21 20:26) より:

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


VB側でフルパス指定しなくても出来ると思いますけど。
Windows の systemディレクトリに置いたりして出来ないですか?
(要は、環境変数PATH の設定がなされているディレクトリ)

スキルアップ/キャリアアップ(JOB@IT)