大神帮忙将C的dll函数接口转delphi

范张 2018-05-22 12:57:38
数据结构
struct GetScanDataResult
{
int errorCode;
char message[128];
char data[256];
char reserved[512 - 388];
};

接口定义
int __stdcall GetScanData(GetScanDataResult* result);

接口获取方法
typedef int (__stdcall *GetScanDataFunc_t)(GetScanDataResult*);

// 获 取 接 口 指 针 示 例 :
// HINSTANCE hDllInst = LoadLibraryA("WangShouYinDll.dll");
// GetScanDataFunc_t getScanDataFunc = (GetScanDataFunc_t)GetProcAddress(hDllInst, "GetScanData");

-----------------------------------------------------------------------------------------------------
我的delphi代码
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
PGetScanDataResult = ^GetScanDataResult;

GetScanDataResult = record
errorCode: integer;
message: array [1 .. 128] of Char;
data: array [1 .. 256] of Char;
reserved: array [1 .. 124] of Char;
end;

function GetScanData(result: PGetScanDataResult): integer; stdcall; external 'WangShouYinDll.dll';

implementation

{$R *.dfm}


procedure TForm1.Button2Click(Sender: TObject);

type
PVFN = Function(result: PGetScanDataResult): integer;
var
fn: PVFN;
hDllInst: Thandle;
Tp: TFarProc;
gsdr: PGetScanDataResult;
begin
try
new(gsdr);
hDllInst := LoadLibrary('WangShouYinDll.dll');
Tp := GetProcAddress(hDllInst, 'GetScanData');
fn := PVFN(Tp);
fn(gsdr);
FreeLibrary(hDllInst);
except
on E: Exception do
end;
end;

end.


调用没问题,但一直报地址错误。感谢哪位大神帮帮忙。


...全文
683 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
范张 2018-05-23
  • 打赏
  • 举报
回复
感谢各位,问题解决了,看了大家的回复后,果断用delphi7 重新编了一次,成功了。 之前有问题是用的 delphi xe10.2 再次感谢!
littlestone08 2018-05-22
  • 打赏
  • 举报
回复
除了stdcall, 另外要确定下你的结构声明的char 数组是不是要用byte , 你的Delphi 版本 char 可不是一个单字节
  • 打赏
  • 举报
回复
这个声明 function GetScanData(result: PGetScanDataResult): integer; stdcall; external 'WangShouYinDll.dll'; 和用LoadLibrary、GetProcAddress方式获取函数指针只需要用其一 用前者,只需要直接调用GetScanData即可 procedure TForm1.Button2Click(Sender: TObject); var gsdr: PGetScanDataResult; begin GetScanData(gsdr); end; 用后者 type PVFN = Function(result: PGetScanDataResult): integer; stdcall;
SupermanTm 2018-05-22
  • 打赏
  • 举报
回复
你 FreeLibrary(hDllInst); 了,那么随后的引用当然地址是有问题的咯
SupermanTm 2018-05-22
  • 打赏
  • 举报
回复
PS: function GetScanData(result: PGetScanDataResult): integer; stdcall; external 'WangShouYinDll.dll'; 这里有问题,你用的是动态加载的方式,而这个声明是静态加载方式的。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧