我有一个由第三方公司提供的DLL,当从Delphi 2007调用时,它工作得非常好。以下代码是如何在Delphi 2007中使用DLL的示例:
Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pChar; Result: pChar); stdcall; external 'XCClient.dll';
以下是程序的调用方式:
procedure TForm1.Button1Click(Sender: TObject);
var Result: array[0..2000] of char;
sParams: String;
begin
sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF
XC_eXpressLink(Handle, pChar(sParams), Result);
memoResults.Text := String(Result);
end;
我不确定编译的DLL是什么,但我假设它期待ansi而不是unicode。在Delphi XE5中将代码转换为ansi之后,代码现在如下:
Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pAnsiChar; Result: pAnsiChar); stdcall; external 'XCClient.dll';
和
procedure TForm1.Button1Click(Sender: TObject);
var Result: array[0..2000] of Ansichar;
sParams: AnsiString;
begin
sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF
XC_eXpressLink(Handle, pAnsiChar(sParams), Result);
memoResults.Text := AnsiString(Result);
end;
memoParameters是表单上的TMemo,它为dll过程提供参数。 RemoveCRLF是一个从memoParameters中删除任何回车和换行的功能。 MemoResults是表单上的另一个TMemo,它提供了dll过程的返回结果。
当在Delphi XE5中运行更改的代码时,我收到了访问冲突。由于我更改了所有参数以使用ansi,因此dll不能获得与以前相同的参数格式吗?难道我做错了什么?我是否能够将这个较旧的编译DLL在Delphi XE5中运行?
答案 0 :(得分:0)
我联系了OpenEdge公司,该公司为X-Charge提供dll(用于信用卡集成)。要解决此问题,句柄的值必须为 0 ,您必须将 / IGNOREHANDLEPARAMETER 添加到发送到该列表的参数列表中。 DLL。请注意,此参数仅适用于完整版XC8.1.1.6.exe安装或更高版本。
procedure TForm1.Button1Click(Sender: TObject);
var Result: array[0..2000] of Ansichar;
sParams: AnsiString;
begin
sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF
XC_eXpressLink(0, pAnsiChar(sParams), Result);
memoResults.Text := AnsiString(Result);
end;