5

Delphi ストリーム (TStream の子孫) を c/c++ で記述された DLL に渡すことは可能ですか? DLL は Microsoft c/c++ で記述されます。それができない場合は、C++ Builder を使用して DLL を作成してみませんか? または、Microsoft C/C++ と Delphi の間で共有できる Stream (FIFO) クラスはありますか?

ありがとう!

4

2 に答える 2

13

これは、 IStreamTStreamAdapterを使用して行うことができます。簡単な例を次に示します (D2007 および XE2 でテスト済み)。

uses
  ActiveX;

procedure TForm1.DoSomething;
var
  MemStream: TMemoryStream;
  ExchangeStream: IStream;
begin
  MemStream := TMemoryFile.Create;
  try
    MemStream.LoadFromFile('C:\Test\SomeFile.txt');
    MemStream.Position := 0;
    ExchangeStream := TStreamAdapter.Create(MemStream) as IStream;
    // Pass ExchangeStream to C++ DLL here, and do whatever else
  finally
    MemStream.Free;
  end;
end;

念のため、別の方法 ( IStreamC/C++ から を受け取る) が必要な場合は、 TOleStreamIStreamを使用してそこからDelphiに取得できますTStream

于 2012-08-03T23:32:02.230 に答える
4
  • Microsoft C/C++ でコンパイルされたコードは、Delphi オブジェクトのメソッドを直接呼び出すことはできません。interfaceたとえば、メソッドを C++ コードにまとめて提示する必要があります。
  • C++ Builder でコンパイルされたコードは、Delphi オブジェクトのメソッドを直接呼び出すことができます。

一般に、Delphi クラスをまとめて として提示することは、interface完全に簡単ではありません。インターフェイスを介してそのままのメソッドを公開できない理由の 1 つは、Delphi メソッドregisterが Embarcadero コンパイラ独自の呼び出し規約を使用していることです。Microsoft コンパイラが理解できる呼び出し規約を使用する必要がありますstdcall

別の問題には例外があります。C++ コードで例外をキャッチすることは期待できないため、インターフェイス メソッドが例外をスローしていないことを確認する必要があります。1 つのオプションは、Delphi のsafecall呼び出し規約を使用することです。safecall呼び出し規約には、例外を値stdcallに変換するひねりが加えられています。HRESULT

コンセプトはかなり単純ですが、おそらくある程度の退屈な定型コードが必要です。

ありがたいことに、 の場合TStream、 を使用TStreamAdapterして Delphi ストリームを COM として公開できますIStream。実際、この小さなクラスのソース コードは、上で説明した問題を処理する方法を示しています。

于 2012-08-03T22:31:56.603 に答える