Delphi7中使用的C ++ DLL函数

时间:2017-09-09 10:05:30

标签: c# c++ delphi dll type-conversion

我想在我的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上调用它,因为answer参数是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中的值,这是整数类型参数但在回答变量中我变得空白。

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

2 个答案:

答案 0 :(得分:1)

您的Delphi函数声明不正确。您不能使用本地Delphi类型的string。答案参数不是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
);

答案 1 :(得分:-1)

类型 如果无法访问DLL,就可以说出了什么问题。但试试这个开始

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

如果我能看到WN_ANSWER_TYPE的c ++定义,我可以帮到你更多。