VB6.0にて自作VCでDLLを作成したものをDeclareを使って呼んでいます。
EXEにすると問題なく動作しているのですが、デバッグ中には実行時エラー49 DLLが正しく読めません とのエラーが出ます。
何か設定が悪いのでしょうか?
Dependency Walkerでは全てのAPIが見えています。
実行ファイルとプロジェクトファイルのパスが違うのでは。
ちなみにDLLはどこに置いていますか。
ねろさん。指摘ありがとうございます。
プロジェクトファイル(*.vbp)はDLLと同じディレクトリにあります。実行ファイル(*.exe)も同じディレクトリに生成されます。
テスト用として
MsgBox(App.Path)
とAPIをコールする直前に入れてみると、デバッグ時もEXE実行時も同じパスが表示されました。
関数の宣言に問題があるのではないでしょうか?
宜しければVB側とVC側の関数の宣言部分だけでも提示されたらいかがでしょうか。
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側でのデバッグでは文字列がうまく渡されていることは確認できました。
よろしくお願いします。
C++ですね。
呼び出し規約を__stdcallにしてみてください。
VBから__cdeclを呼び出すと、スタックの復帰が
正常に行われません。
ねろさん。いろいろありがとうございます。
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が出てしまいます。
正しくエクスポートできていないからとは思いませんか?
1から10まで説明するのは難しいと思われるので参考になるURLを記しておきます。
http://www.angel.ne.jp/~mike/vb_dll/vb_dll02.html
を見て作り方に問題がないか検討してみてください。
ちなみに「DLL VB」でググッた中のひとつです。
DEFファイルを作成して
LIBRARY MyDll.dll
EXPORTS
LibRead
としてみて下さい。
簡単なDLL作成サンプル
http://support.microsoft.com/default.aspx?scid=kb;ja;410837
ねろさん。abuさん。ありがとうございました。
defファイルを作って、VC++のプロジェクトに追加して作ったDLLファイルだと、VBデバッグ時でもエラーが出なくなりました。
EXEファイルでのデバッグは大変だったので、助かりました。
はじめての自作DLLだったので大変勉強になりました。
教えていただいたURLを見て理解を深めようと思います。
ツイート | ![]() |