2

すべての VB.NET DLL 宣言を変換しました

Declare Function SFileOpenArchive Lib "Storm.dll" Alias "#266" (ByVal lpFileName As String, ByVal dwPriority As Integer, ByVal dwFlags As Integer, ByRef hMPQ As Integer) As Boolean

デルフィに。

function SFileOpenArchive(lpFileName: String; dwPriority, dwFlags, hMPQ: Integer): Boolean; stdcall; external 'Storm.dll';

ただし、関数を呼び出してプログラムをコンパイルすると、次のエラーが発生します。

プロシージャ エントリ ポイント SFileOpenArchive が、ダイナミック リンク ライブラリ Storm.dll 内に見つかりませんでした。

私は次のことを確認しました:

  1. DLL はアプリケーションと同じディレクトリに格納されます。
  2. 私が宣言した関数が存在する(VB.NETでコーディングされたソースコードが与えられた)

このエラーを修正するにはどうすればよいですか?

よろしくお願いします。

4

1 に答える 1

4

私が見ることができる次の問題があります。

  1. 関数は、名前ではなく序数でエクスポートされました。Delphi コードで序数を指定する必要があります。
  2. 最初のパラメータは、Delphi 文字列ではなく PAnsiChar にする必要があります。VB コードは string を使用して、マーシャラーにヌル終了文字列を渡すように指示します。経験則として、文字列のような Delphi マネージド stype を DLL のインポートまたはエクスポートに含めるのは、ほとんどの場合間違いです。
  3. 最後のパラメーターは参照によって渡されます。それは Delphi の var パラメータです。
  4. 戻り値は BOOL である必要があると思いますが、おそらく問題にはなりません。

次のようにすべてをまとめます。

function SFileOpenArchive(lpFileName: PAnsiChar; 
    dwPriority, dwFlags: Integer; var hMPQ: Integer): BOOL; 
    stdcall; external 'Storm.dll' index 266;

テキスト エンコーディングが ANSI であることを 100% 確信しているわけではないことに注意してください。ただし、主な障害は序数のインポートでした。私はあなたのためにそれをクリアしたことを願っています. 残りの詳細を解決できると信じています。

于 2012-10-14T22:04:50.783 に答える