我应该如何在Delphi 6中调用这个特殊的dll函数

时间:2013-07-10 20:33:32

标签: delphi dll loadlibrary

我非常擅长从DLL调用函数(称之为糟糕的编程习惯,但我从来不需要)。

我有这个C ++ dll(https://skydrive.live.com/redir?resid=4FA1892BF2106B62!1066处的CidGen32.dll),它应该导出一个带有以下签名的函数:

extern "C" __declspec(dllexport) int GetCid(const char* pid, char* cid); 

它应该做的是获得一个13字符串,如'1111111111118'并返回一个20字符哈希值。

我在过去几天试过在Delphi 6中调用此函数但无济于事。我拼命尝试了50多种组合,但有一次我很接近,但我的计算机冻结了,我失去了所有的努力。因为它是基于运气,我不能重做它。

我的目标也不是注册DLL,而是将其放在同一个文件夹中。

无论如何,计划是这样的:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

  function GenerateCID(Prm: string): string;
  var
    aCID: PAnsiChar;
    uCID: AnsiString;
    i: integer;
    Hbar: Thandle;
    GetCID: function (X: PAnsiChar; Y: PAnsiChar): integer; {$IFDEF WIN32} stdcall; {$ENDIF}
  begin
    ucid := '';
    hbar := LoadLibrary('CidGen32.dll');
    if Hbar >= 32 then
    begin
      @GetCID := GetProcAddress(HBar, 'GetCID');
      if Assigned(GetCID) then
      begin
        i := GetCID(pAnsiChar(prm), aCID);
        uCID := aCID;
      end;
      FreeLibrary(HBar);
    end
    else
    begin
      //ShowMessage('Error: could not find dll');
    end;
    result := uCID;
  end;

begin
  ShowMessage(GenerateCID('1111111111118'));
end;

end.

但似乎我错了。

1 个答案:

答案 0 :(得分:3)

您使用错误的名称导入该功能。它的名称是GetCid,但您尝试导入GetCID。致电GetProcAddress时,信件案件很重要。如果仍然没有导致GetProcAddress调用成功,请使用Dependency Walker之类的工具仔细检查导出函数的名称。

该函数是cdecl,所以你应该这样声明:

GetCID: function(pid, cid: PAnsiChar): Integer; cdecl;

另一个问题是你负责在cid后面分配缓冲区。你没有这样做。这样做:

SetLength(uCID, 20);
i := GetCID(pAnsiChar(prm), pAnsiChar(uCID));

删除aCID变量。并且> 32错误检查是错误的,与0比较。