从 Delphi XE5 调用时,预 unicode 编译的 DLL 会出现访问冲突

Pre-unicode compiled DLL gives access violations when calling from Delphi XE5

我有一个由第 3 方公司提供的 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。 DelphiXE5中将代码转成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 中删除任何回车符 returns 和换行符。 MemoResults 是表单上的另一个 TMemo,它提供了 dll 过程的 return 结果。

当 Delphi XE5 中更改的代码为 运行 时,我遇到了访问冲突。由于我更改了所有参数以使用 ansi,dll 不应该获得与以前相同的参数格式吗?难道我做错了什么?我能否让这个较旧的已编译 DLL 在 Delphi XE5 中工作?

我联系了 OpenEdge 公司,该公司为 X-Charge(用于信用卡集成)提供 dll。要解决此问题,Handle 的值必须为 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;