我有一个dll,从C++中接收字节数组指针,并尝试以以下方式将这些数据移入AnsiString
在C++中,我在构造函数中设置了Convert:
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;
这个程序在正常情况下工作良好,但是从C++端调用SetString时会出现AV错误。
请帮助我解决这个问题。
RredCat补充说明:
首先关于我们所使用的语言。我们需要在C#项目中调用Delphi动态链接库。为此,我创建了一个C++\CLI层(proxy)。 现在关于头文件中的C++\CLI代码:
HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
在C++中,我在构造函数中设置了Convert:
hDelphiDLL = LoadLibrary(<path to dll>);
if(NULL != hDelphiDLL ){
pPBDFUNC clb= GetProcAddress(HMODULE(hDelphiDLL), "Convert");
if(NULL != clb){
Convert= pPBDFUNC (clb);
}...
最后一个我从C#调用的方法:
void Class1::Test(byte* aBytes, int size){
Convert(aBytes,size);
}
TBytes
,只需使用M.Memory
和M.Size
。