4

モジュールに次の宣言があります。

Private Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As String, ByVal mode As String) As Long

関数内の次のコード行は、「ファイルが見つかりません: ZLIB.DLL」エラーで失敗します。

lGZFileHandle = gzopen(sPath, "rb")

ZLIB を登録する必要がないことは承知しています。私の質問は、コードが機能するために ZLIB.DLL をどこに置く必要があるかということです。また、このコードが別のマシンで動作していることも知っています。現在、アプリケーションexeと同じフォルダーにZLIB.DLLがあります。

アップデート

私の安堵のために、コードはコンパイル時に機能します。ただし、IDE での実行中は機能しません (別のマシンでは機能します)。アプリケーション フォルダにまだ ZLIB.DLL があります。これは、DLL をロードするためにアプリケーション パスをチェックする必要があることを意味します。

これを回避するために、私は試しました:

Private Declare Function SetDllDirectory Lib "Kernel32" Alias "SetDllDirectoryA" (ByVal path As String) As Long

そして、関数で:

SetDllDirectory App.path

これで DLL をロードできるように見えますが、代わりに「DLL 呼び出し規約が正しくありません」というエラーが表示されます。プロットが厚くなります。

解決した

答えはここにあるようです: http://www.zlib.net/DLL_FAQ.txt。それは私が推測するRTFMの場合です。そのため、奇妙なことに、IDE 内ではSTD_CALL規約が有効ですが、一度コンパイルすると C スタイルの呼び出し規約で十分です。IDE の別のマシンで動作する理由はまだ説明されていません。うーん。

私を正しい方向に向けてくれてありがとう。

4

4 に答える 4

7

VB6 は、Ken によって提案された検索プロトコルから少し外れています (このリンクはクイック リファレンスです)。

通常の問題は、.exe パス (リストの検索場所 #1) がVB プログラムのパスではなく、VB6 IDE であるということです。そのため、DLL を VB プログラムの場所に置くのは良くありません。VB6 ショートカットの「開始」場所をその場所を指すように変更しない限りです。

または、私のリンクで指定されている他の場所のいずれかに DLL を配置することもできます。

于 2009-09-24T19:29:46.400 に答える
2

Visual Studio IDE から実行する場合、すべての相対ファイルを次のフォルダーに配置する必要があります: C:\Program Files\Microsoft Visual Studio\VB98\

これは、デバッグ中に実行されている exe がそのフォルダーに存在するためです。これにより、パスを変更せずにデバッグできます。

于 2012-06-14T17:05:31.550 に答える
0

ZLib は、標準の DLL ロード検索パスにある必要があります。DLL の検索方法と検索順序の詳細については、 MSDN LoadLibraryのドキュメントを参照してください。

于 2009-09-24T19:20:21.377 に答える
0

ZLIB を登録する必要はありませんか?

登録してやり直すことをお勧めします。

編集
DLL を System フォルダに入れてみてください。私はあなたのプログラムがそれをチェックすると信じています。

于 2009-09-24T19:09:12.680 に答える