gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:42:01 27 4
gpt4 key购买 nike

我对从 DLL 调用函数完全陌生(称之为不良编程习惯,但我从来不需要)。

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

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.

但似乎我大错特错了。

最佳答案

您使用了错误的名称来导入函数。它的名字是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 进行比较。

关于delphi - 我应该如何在 Delphi 6 中调用这个特定的 dll 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com