gpt4 book ai didi

.net - 在Delphi 7中调用C++ DLL函数

转载 作者:行者123 更新时间:2023-12-01 17:02:04 27 4
gpt4 key购买 nike

我有一个用 C++ 编写的 DLL。我想从 Delphi 7 中调用其中的函数。

我只有一个用 VB.NET 编写的示例。

在此处发布之前,我已尝试自己转换代码。

问题是当我调用该函数时,它给出了错误的二进制输出,这显然意味着我对输入做了错误的操作。

以下是 VB.NET 中的原始代码:

Private Shared Declare Unicode Function Read_Write Lib "Subway.dll" (obej As IntPtr, Data_in As Byte(), in_siz As Integer, <Out()> ByRef Data_out As IntPtr, ByRef out_siz As Integer) As Integer

Dim obej As IntPtr = IntPtr.Zero
Dim Data_out As IntPtr = 0
Dim out_siz As Integer = 0
Dim Res As Integer = -1

Res = Read_Write(obej, Encoding.[Default].GetBytes(Mystr), Mystr.Length, Data_out, out_siz)

以及我在 Delphi 中转换后的代码:

function Read_Write(obej: Pointer; Data_in: TByteDynArray; in_siz:Cardinal; var Data_out: TByteDynArray; var out_siz: Cardinal): Integer; stdcall; external 'Subway.dll';

var
tx, rx: TByteDynArray;
obej: pointer;
s:string;
Res: Integer;
out_siz: Integer;

SetLength(tx, Length(s));
Move(s[1], tx[0], Length(s));
Res := Read_Write(obej, tx, length(s), rx, out_siz);

原始调用(C语言):

int __stdcall Read_Write(void *u_arg, const unsigned char  *p_data_in, unsigned int  data_in_len, unsigned char  **pp_data_out, unsigned int  *p_data_out_len);

最佳答案

您的 Read_Write() 的 Delphi 声明与 VB.NET 声明不匹配。您没有考虑 .NET 如何将参数编码到非托管语言。此外,TByteDynArray 是 Delphi 特定的类型,您无法将其按原样传递给其他语言,尤其是在输出参数中。

尝试更多类似这样的事情:

function Read_Write(obej: Pointer; Data_in: PByte; in_siz: Integer, var Data_out: Pointer; var out_siz: Integer): Integer; stdcall; external 'Subway.dll';

var
obej: Pointer;
Data_out: Pointer;
out_siz: Integer;
Res: Integer;
MyStr: AnsiString;
buf: TByteDynArray;
begin
...

obej := nil;
Data_out := nil;
out_siz := 0;

MyStr := ...;
SetLength(buf, Length(MyStr));
Move(PAnsiChar(MyStr)^, PByte(buf)^, Length(MyStr));

Res := Read_Write(obej, PByte(buf), Length(buf), Data_out, out_siz);
// use Data_out up to out_siz bytes as needed...
// free Data_out as needed...

...
end;

或者,您可以省略 TByteDynArray 并直接跳过 AnsiString 数据:

Res := Read_Write(obej, PByte(PAnsiChar(MyStr)), Length(MyStr), Data_out, out_siz);

关于.net - 在Delphi 7中调用C++ DLL函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56328954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com