gpt4 book ai didi

c# - Delphi7中使用的C++ DLL函数

转载 作者:太空狗 更新时间:2023-10-29 23:12:26 25 4
gpt4 key购买 nike

我想在我的 delphi 7 项目中使用 c++ DLL。我在我的 delphi7 项目中成功调用了一个 DLL 函数,但在另一个参数为 stringbuilder 的函数中出错。C++函数的详细信息如下。(我从dll的头文件中得到的)

WN_COMM_ERR WINAPI MYFUNCTION(WN_COMM_HANDLE handle, const char *command, char *answer, unsigned long maxlen, unsigned long timeout_ms, WN_ANSWER_TYPE *type);

答案类型是枚举类型:-

 typedef enum {
WN_ANSWER_ACK = '>', // An OK frame was received
WN_ANSWER_NACK = '!', // An ERR frame was received
WN_ANSWER_TOUT = 0, // Command timed out before an answer could be received
}WN_ANSWER_TYPE;

我已经在 C# 代码中成功调用了相同的函数并且它正在运行。但是我不知道如何在 delphi7 上调用它,因为答案参数是 stringbuilder 类型,而在 delphi7 中它们不是任何 stringbuilder 类型的东西。我尝试使用 Pansichar、string、pchar 但没有在答案类型变量中获取值:-

C# 声明:有效

    [DllImport("wn_comm.dll", CharSet = CharSet.Unicode)]
public static extern UInt32 MYFUNCTION(IntPtr handle, string command, StringBuilder answer, UInt32 maxlen, UInt32 timeout_ms, ref Int32 answer_type);

调用 C# 函数:有效

WriteNowWrapper.MYFUNCTION(this.comm_handle, command, sbAnswer, (uint)sbAnswer.Capacity, Timeout, ref answerType)

当我从我的 C# 应用程序调用上面时,我已成功接收到 answertype 和 sbanswer 变量值。

Delphi7 声明:不工作

function MYFUNCTION  (handle:Longint; command:string;var answer:PAnsichar; maxlen:integer; Timeout:integer; VAR answretype:INTEGER) : longint; stdcall; external 'wn_comm.dll';

Delphi7调用函数:不工作

   MYFUNCTION(self.comm_Handle,command,answer,2,Timeout,answerType)

当我从 delphi7 应用程序调用 MYFUNCTION 时。它成功执行并更新了整数类型参数 answertype 中的值,但在 answer 变量中我变得空白。

任何人都可以帮助我我做错了什么吗?

最佳答案

您的 Delphi 函数声明不正确。您不得使用 native Delphi 类型的 string。 answer 参数不是 var 参数。

声明应该是:

function MYFUNCTION(
handle: Integer;
command: PAnsichar;
answer: PAnsichar;
maxlen: Cardinal;
timeout_ms: Cardinal;
out answer_type: Integer
): Cardinal; stdcall; external 'wn_comm.dll';

您问题中缺少的细节是分配 answer 的部分。您显然是在 C# 代码中这样做的。这看起来像这样:

StringBuilder sbAnswer = new StringBuilder(256);

我已经猜到要为容量使用什么值。在您的 Delphi 调用代码中,您需要类似的东西。

var
handle: Integer;
command: AnsiString;
answer: AnsiString;
timeout_ms: Integer;
answer_type: Integer;
err: Integer;
....
handle := ...;
command := ...;
SetLength(answer, 256);
timeout_ms := ...;
err := MYFUNCTION(
handle,
PAnsiChar(command),
PAnsiChar(answer),
Length(answer),
timeout_ms,
answer_type
);

关于c# - Delphi7中使用的C++ DLL函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129473/

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