我想在我的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,但没有在回答类型变量中获取值: -
[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);
WriteNowWrapper.MYFUNCTION(this.comm_handle, command, sbAnswer, (uint)sbAnswer.Capacity, Timeout, ref answerType)
当我从我的c#应用程序上面调用时,我已经成功接收到answertype和sbanswer变量值。
function MYFUNCTION (handle:Longint; command:string;var answer:PAnsichar; maxlen:integer; Timeout:integer; VAR answretype:INTEGER) : longint; stdcall; external 'wn_comm.dll';
MYFUNCTION(self.comm_Handle,command,answer,2,Timeout,answerType)
当我从delphi7应用程序调用MYFUNCTION时。它成功执行并更新answertype中的值,这是整数类型参数但在回答变量中我变得空白。
任何人都可以帮助我,我做错了什么?
答案 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 ++定义,我可以帮到你更多。