【发布时间】:2012-02-01 15:08:17
【问题描述】:
我有一个 dll,它接受来自 C++ 的指向字节数组的指针,并尝试通过以下方式将此数据移动到 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;
它工作正常,但是从 c++ 中如果在 SetString 上给出 AV。
请帮帮我。
来自 RredCat:
让我对 Yuriy 的问题做一些解释: 首先是关于我们使用的语言。我们需要在 C# 项目中调用 Delphi dll。为此,我创建了 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# 调用的方法:
void Class1::Test(byte* aBytes, int size){
Convert(aBytes,size);
}
【问题讨论】:
-
1.不需要
TBytes。只需使用M.Memory和M.Size。 2. 至于问题本身,给我们看C++。或者 C#,不管它是什么。 -
他两次提到 C++,并把它标记为 C++,所以我要更改标题。
标签: c# c++ delphi interop data-conversion