VB6.0にて実行時エラー49 DLLが正しく読めませんをでなくすには?

解決


よっすい  2005-01-09 02:00:37  No: 87699

VB6.0にて自作VCでDLLを作成したものをDeclareを使って呼んでいます。
EXEにすると問題なく動作しているのですが、デバッグ中には実行時エラー49  DLLが正しく読めません  とのエラーが出ます。
何か設定が悪いのでしょうか?
Dependency Walkerでは全てのAPIが見えています。


ねろ  2005-01-10 05:21:55  No: 87700

実行ファイルとプロジェクトファイルのパスが違うのでは。
ちなみにDLLはどこに置いていますか。


よっすい  2005-01-10 18:09:51  No: 87701

ねろさん。指摘ありがとうございます。
プロジェクトファイル(*.vbp)はDLLと同じディレクトリにあります。実行ファイル(*.exe)も同じディレクトリに生成されます。
テスト用として
MsgBox(App.Path)
とAPIをコールする直前に入れてみると、デバッグ時もEXE実行時も同じパスが表示されました。


ねろ  2005-01-10 22:19:57  No: 87702

関数の宣言に問題があるのではないでしょうか?
宜しければVB側とVC側の関数の宣言部分だけでも提示されたらいかがでしょうか。


よっすい  2005-01-10 22:42:28  No: 87703

VC側の宣言
extern "C" {
    __declspec(dllexport) int LibRead( char * ); // 文字列が引数
};

VB側の宣言
Public Declare Function LibRead Lib "Mydll.dll" (ByVal Name As String) As Long

このようにしています。
動作はVBから文字列をVCに渡して結果をVB側に戻すAPIです。
VBの実行ファイルを作って、VC側でのデバッグでは文字列がうまく渡されていることは確認できました。
よろしくお願いします。


ねろ  2005-01-11 00:51:02  No: 87704

C++ですね。
呼び出し規約を__stdcallにしてみてください。
VBから__cdeclを呼び出すと、スタックの復帰が
正常に行われません。


よっすい  2005-01-11 02:51:16  No: 87705

ねろさん。いろいろありがとうございます。
C++はよく知らないのでVCと書いてます。実際VC++も中身はC言語です。

関数前の宣言で何が起こっているのかよく知らないのですが、
変更前
 __declspec(dllexport) int LibRead( char * ); 
変更後
 __declspec(dllexport) int __stdcall LibRead( char * );
としたのですが、間違ってますでしょうか?
ビルドはエラーが出ませんでした。
それでVBからデバッグで実行すると、
実行時エラー453  エントリLibReadがDLLファイルMyDll.dll内に見つかりません。
とエラーが変わりました。
そこで、
Dependency WalkerでDllを見るとLibReadが_LibRead@4と変わっていましたので、VB側の宣言を
Public Declare Function LibRead Lib "Mydll.dll" Alias "_LibRead@4" (ByVal Name As String) As Long
に変えてみたのですが、結果は実行時エラー49が出てしまいます。


abu  2005-01-11 03:14:15  No: 87706

正しくエクスポートできていないからとは思いませんか?
1から10まで説明するのは難しいと思われるので参考になるURLを記しておきます。

http://www.angel.ne.jp/~mike/vb_dll/vb_dll02.html

を見て作り方に問題がないか検討してみてください。
ちなみに「DLL VB」でググッた中のひとつです。


ねろ  2005-01-11 04:57:45  No: 87707

DEFファイルを作成して
LIBRARY MyDll.dll
EXPORTS
    LibRead
としてみて下さい。


ねろ  2005-01-11 17:39:19  No: 87708

簡単なDLL作成サンプル
http://support.microsoft.com/default.aspx?scid=kb;ja;410837


よっすい  2005-01-11 18:36:52  No: 87709

ねろさん。abuさん。ありがとうございました。
defファイルを作って、VC++のプロジェクトに追加して作ったDLLファイルだと、VBデバッグ時でもエラーが出なくなりました。
EXEファイルでのデバッグは大変だったので、助かりました。
はじめての自作DLLだったので大変勉強になりました。
教えていただいたURLを見て理解を深めようと思います。


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

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






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