Delphi ストリーム (TStream の子孫) を c/c++ で記述された DLL に渡すことは可能ですか? DLL は Microsoft c/c++ で記述されます。それができない場合は、C++ Builder を使用して DLL を作成してみませんか? または、Microsoft C/C++ と Delphi の間で共有できる Stream (FIFO) クラスはありますか?
ありがとう!
これは、 IStreamとTStreamAdapterを使用して行うことができます。簡単な例を次に示します (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;
念のため、別の方法 ( IStream
C/C++ から を受け取る) が必要な場合は、 TOleStreamIStream
を使用してそこからDelphiに取得できますTStream
。
interface
たとえば、メソッドを C++ コードにまとめて提示する必要があります。一般に、Delphi クラスをまとめて として提示することは、interface
完全に簡単ではありません。インターフェイスを介してそのままのメソッドを公開できない理由の 1 つは、Delphi メソッドregister
が Embarcadero コンパイラ独自の呼び出し規約を使用していることです。Microsoft コンパイラが理解できる呼び出し規約を使用する必要がありますstdcall
。
別の問題には例外があります。C++ コードで例外をキャッチすることは期待できないため、インターフェイス メソッドが例外をスローしていないことを確認する必要があります。1 つのオプションは、Delphi のsafecall
呼び出し規約を使用することです。safecall
呼び出し規約には、例外を値stdcall
に変換するひねりが加えられています。HRESULT
コンセプトはかなり単純ですが、おそらくある程度の退屈な定型コードが必要です。
ありがたいことに、 の場合TStream
、 を使用TStreamAdapter
して Delphi ストリームを COM として公開できますIStream
。実際、この小さなクラスのソース コードは、上で説明した問題を処理する方法を示しています。