3

Delphi XE2 内で使用するために、一部のレガシー コードを Delphi 7 でラップする必要があります。私の質問は単純に思えますが、見つけたすべての例を試してみましたが、すべて失敗しました。基本的に、D7 と DXE2 の間で文字列を渡すことができる必要があります。私が理解できる限り、最も安全な方法は pchar を使用することです (borlandmm dll を出荷したくないため)。そのため、DLL は D7 で作成され、Delphi XE2 によって呼び出されます。

私のインターフェースは

私のDLLで:

function d7zipFile(pFatFile,pThinFile : PChar) : integer; stdCall;
function d7unzipfile(pThinFile,pFatFile : PChar) : integer; stdCall;

unzipfile 関数で pFatFile 名を BACK に渡す必要があります。

私の呼び出しコードで:

function d7zipFile(pFatFile,pThinFile : PChar) : integer; external 'd7b64zip.dll';

function d7unzipfile(pThinFile,pFatFile : PChar) : integer; external 'd7b64zip.dll';

誰かがこれらを実装するための最良の方法を手伝ってくれませんか?

明らかに、実際の zip/unzip コードを探しているわけではありません。D7 内で問題なく動作しています。私が試したさまざまなタイプ(PWideChar、WideString、ShortStringなど)ですべてエラーが発生するため、string / pcharパラメーターを宣言して操作する方法を知りたいです。

したがって、両方のファイル名に対して d7zipFile 関数で単純に showMessage を実行できれば幸いです。そして、pFatFile 変数に対して delphiXE2 で showMessage を実行できるようになりました。これは、文字列が双方向に送信されたことを意味します。

4

1 に答える 1

6

これを行う最も簡単な方法は、 を使用することWideStringです。BSTRこれは、COMタイプの Delphi ラッパーです。文字列ペイロードの動的割り当ては、共有 COM アロケーターを使用して行われます。Delphi RTL がそれを管理するため、透過的です。

Delphi 7 コードでは、次のように関数を宣言します。

function d7zipFile(const FatFile, ThinFile: WideString): integer; stdcall;
function d7unzipfile(const ThinFile: WideString; var FatFile: WideString): 
    integer; stdcall;

呼び出しコードでは、次のように関数を宣言します。

function d7zipFile(const FatFile, ThinFile: WideString): integer; stdcall; 
    external 'd7b64zip.dll';
function d7unzipfile(const ThinFile: WideString; var FatFile: WideString): 
    integer; stdcall; external 'd7b64zip.dll';

このアプローチに代わる方法は、PAnsiCharorを使用することPWideCharです。PCharそのエイリアスは、使用する Delphi のバージョンに応じて異なる型を参照するため、使用できないことに注意してください。Delphi 7PCharでは のエイリアスでPAnsiCharあり、XE2 では のエイリアスですPWideChar

たとえば、を使用することの大きな欠点はPAnsiChar、DLL から返される文字列を呼び出し元が割り当てる必要があることです。しかし、通常、呼び出し元はその文字列に必要な大きさを知りません。この問題にはさまざまな解決策がありますが、最も適切な方法は常に共有アロケーターを使用することです。あなたは依存したくないと述べてborlandmm.dllいるので、次に最も明白な一般的なアロケーターは COM アロケーターです。そしてそれが魅力的な理由WideStringです。

于 2012-07-24T08:41:48.547 に答える