Delphi - 使用现有dll的问题

时间:2010-07-08 09:36:15

标签: delphi dll

我必须使用现有的dll,但是遇到了问题。

以下是我尝试使用它的方法:

单位u_main;

...
implementation

procedure getUserData(var User, Pass: string); stdcall; external 'Common5.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  u, p: string;
begin
   getUserData(u,p);
end;
...
end.

当我按下按钮获取userData时,我得到一个EInvalidPointer异常。 dll已注册,在其他一些项目中,它正在使用和工作中。任何想法?

编辑: DLL是在Delphi7中创建的,现在用于Delphi 2009项目。 也许unicode字符串有类似的问题?

2 个答案:

答案 0 :(得分:4)

您需要重建Delphi 7 DLL,使其遵循获取PChar和BufferLen参数的WinApi标准。你当前的实现有多个问题:

  1. 字符串是特定于平台的,它的实现可能会在delphi版本之间发生变化(并且确实发生了变化)。你不应该在平台之外使用字符串!
  2. 您将参数传递为“var”,表明DLL可能会更改user和/或pass的值。 String是一种特殊的托管类型,更改它需要为新字符串分配内存。这反过来要求您在DLL和EXE之间共享内存管理器(使用sharemem.pas和BorlandMM.dll - 或变体)。问题是,在不同版本的Delphi之间共享内存管理器是一个不受支持的配置! (来自embarcadero论坛的gotton)
  3. Delphi 7希望收到一个简单的AnsiString(1字节字符),而Delphi 2009 exe则发送Unicode字符串(每个字符2个字节)。

答案 1 :(得分:1)

除了使用PChar之外,请务必在调用GetUserData之前预先分配空间。即如果你将'foo'分配给一个空的pchar,你就会爆炸。因此要么使用静态长度PChar / PAnsiChar数组,要么使用这种技术:

var
  s : AnsiString;
begin
  setlength(s,256);
  MyDLLProc(PAnsiChar(s));
end;