更正从C++到delphi AnsiString的字节转换
Correct converting bytes from C++ to delphi AnsiString
我有一个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++if在SetString上给出AV。
请帮我做这个。
来自RredCat:
让我对尤里的问题补充一些解释:首先是关于我们使用的语言。我们需要在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);
}
您的Delphi代码传递一个指向字节数组的指针。简化为只使用指向字节数组的指针:
procedure Convert(const PByteArr: Pointer; ArrSize: Cardinal); export; cdecl;
var
Buf: AnsiString;
begin
SetString(Buf, PAnsiChar(PByteArr), ArrSize);
end;
并称之为
Convert(@Arr[0], Length(Arr));
或
Convert(Pointer(Arr), Length(Arr));
这是相同的。
您使这项任务变得比需要的要复杂得多。当您有一个现有的C或C++代码体,或者一个具有非常大接口的本地库时,C++/CLI非常棒。只要您只有少数几个函数,那么直接p/invoke到本地Delphi DLL就是一种方法。
Serg已经指出了Delphi函数中虚假的额外间接级别。所以我会把Delphi函数写成:
procedure TestFunction(Text: PAnsiChar); stdcall;
var
Buf: AnsiString;
begin
Buf := Text;
end;
在C#端,您可以这样声明函数:
[DllImport(@"mydll.dll")]
static extern void TestFunction(string Text);
您可以从C#代码中调用此函数,如下所示:
TestFunction("Hello");
string str = GetStringFromSomewhere();
TestFunction(str);
就这样!由于在C#端有一个字符串变量,因此可以依靠p/invoke marshaller为本机代码提供一个以null结尾的字符串。因此,没有必要通过长度。p/invoke的默认调用约定是stdcall
,因此更喜欢Delphi代码中的调用约定。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 更正从C++到delphi AnsiString的字节转换