C ++からのバイト配列へのポインタを受け入れるdllがあり、このデータを次の方法でAnsiStringに移動しようとしています
procedure Convert(const PByteArr: Pointer; ArrSize: Cardinal); export; cdecl;
var
Buf: AnsiString;
begin
SetString(Buf, PAnsiChar(PByteArr^), ArrSize);
end;
Delphiからこのメソッドを呼び出すと
procedure Try;
var
M: TMemoryStream;
Arr: TBytes;
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('myfile.dat');
SetLength(Arr, M.Size);
M.Position := 0;
M.Read(Arr[0], M.Size);
finally
M.Free;
end;
Convert(@Arr, Length(Arr));
end;
正常に動作しますが、SetStringでAVを提供する場合はC++からです。
これを手伝ってください。
RredCatから:
Yuriyの質問にいくつか説明を追加しましょう。まず、私たちが使用する言語についてです。C#プロジェクトでDelphidllを呼び出す必要があります。この目的のために、C ++ \ CLIレイヤー(プロキシ)を作成しました。次に、ヘッダーファイルのC ++\CLIコードについて説明します。
HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
cppで、コンストラクターでConvertを設定しました。
hDelphiDLL = LoadLibrary(<path to dll>);
if(NULL != hDelphiDLL ){
pPBDFUNC clb= GetProcAddress(HMODULE(hDelphiDLL), "Convert");
if(NULL != clb){
Convert= pPBDFUNC (clb);
}...
そして、C#から呼び出す最後の1つのメソッド:
void Class1::Test(byte* aBytes, int size){
Convert(aBytes,size);
}