从Delphi XE5调用时,pre-unicode编译的DLL会提供访问冲突

时间:2016-08-11 21:40:06

标签: delphi unicode delphi-xe5 delphi-2007 ansi

我有一个由第三方公司提供的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中运行?

1 个答案:

答案 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;