delphi dll及函数指针的使用
2008-09-25 18:24
435 查看
1.怎么样调用dll函数
procedure TBMFather.DOReport(sReportType:TBMReport; sOID:string = '');
type
TPuFun = function (TempLateURL: pchar;CusCallBack: pointer): integer; stdcall;
//声明回调函数
var
f:TfrmWebReport;
sURL:string;
a: array of integer;
ctype: string;//'h','hf','f'
Th: THandle;
Tf: TPuFun;
begin
//调用dll函数--------------------------------------------------
Th := LoadLibrary(PChar('BM_HASPX.dll'));
if Th > 0 then
try
try
@tf := GetProcAddress(Th, PChar('ASPX_DOReport')); //暴露函数
if Assigned(@tf) then
begin
if ctype='h' then
//下面的@Cus_SplitHTML为回调函数地址,将此地址传到dll中,由dll中的函数调用回调函数
Tf(pchar(surl), @Cus_SplitHTML) //@Cus_SplitHTML:@+函数名为函数地址
else if ctype='f' then
Tf(pchar(surl), @Cus_SplitHTMLF)
else if ctype='hf' then
Tf(pchar(surl), @Cus_SplitHTMLHF)
else //Tf(param1, param2)
Tf(pchar(surl), nil);
end;
finally
FreeLibrary(Th);
end
except
end;
end
2.dll暴露函数
function ASPX_DOReport(TempLateURL: pchar;CusCallBack: pointer): integer; stdcall;
begin
end;
3.dll中的函数:根据调用程序的函数指针(即@Cus_SplitHTML),调用函数
procedure TfrmWebReport.btn1Click(Sender:TObject);
//调用回调函数,首先需要先声明
type
TPuFun_Cus = procedure(const SourcHTML: pchar; var NewHTML1: pchar;var AttachList:array of
pchar);stdcall;
var
TmpTPuFUN : TPuFun_Cus;
begin
try
if wordback<>nil then //回调指针 @Cus_SplitHTML
begin
TmpTPuFUN := TPuFun_Cus(wordback); //根据函数指针就可以了
TmpTPuFUN(pchar(webstr), newhtml2, attractlist); //参数为本地参数
end
end;
4.提供函数指针的函数,申明如下
procedure Cus_SplitHTMLHF(const SourcHTML: pchar;var NewHTML: pchar;
var AttachList: array of pchar);stdcall;
//这个函数即是我们需要回调的函数体
以上的过程相当于一个循环:主程序调用DLL函数,DLL函数再次调用主程序的回调函数
主程序中定义的回调函数要注意位置,由于dll需要取得回调函数的地址,如果回调函数是声明在类
中的话,取地址会比较麻烦,所以这里的回调函数体的实现是在类以外的。
procedure TBMFather.DOReport(sReportType:TBMReport; sOID:string = '');
type
TPuFun = function (TempLateURL: pchar;CusCallBack: pointer): integer; stdcall;
//声明回调函数
var
f:TfrmWebReport;
sURL:string;
a: array of integer;
ctype: string;//'h','hf','f'
Th: THandle;
Tf: TPuFun;
begin
//调用dll函数--------------------------------------------------
Th := LoadLibrary(PChar('BM_HASPX.dll'));
if Th > 0 then
try
try
@tf := GetProcAddress(Th, PChar('ASPX_DOReport')); //暴露函数
if Assigned(@tf) then
begin
if ctype='h' then
//下面的@Cus_SplitHTML为回调函数地址,将此地址传到dll中,由dll中的函数调用回调函数
Tf(pchar(surl), @Cus_SplitHTML) //@Cus_SplitHTML:@+函数名为函数地址
else if ctype='f' then
Tf(pchar(surl), @Cus_SplitHTMLF)
else if ctype='hf' then
Tf(pchar(surl), @Cus_SplitHTMLHF)
else //Tf(param1, param2)
Tf(pchar(surl), nil);
end;
finally
FreeLibrary(Th);
end
except
end;
end
2.dll暴露函数
function ASPX_DOReport(TempLateURL: pchar;CusCallBack: pointer): integer; stdcall;
begin
end;
3.dll中的函数:根据调用程序的函数指针(即@Cus_SplitHTML),调用函数
procedure TfrmWebReport.btn1Click(Sender:TObject);
//调用回调函数,首先需要先声明
type
TPuFun_Cus = procedure(const SourcHTML: pchar; var NewHTML1: pchar;var AttachList:array of
pchar);stdcall;
var
TmpTPuFUN : TPuFun_Cus;
begin
try
if wordback<>nil then //回调指针 @Cus_SplitHTML
begin
TmpTPuFUN := TPuFun_Cus(wordback); //根据函数指针就可以了
TmpTPuFUN(pchar(webstr), newhtml2, attractlist); //参数为本地参数
end
end;
4.提供函数指针的函数,申明如下
procedure Cus_SplitHTMLHF(const SourcHTML: pchar;var NewHTML: pchar;
var AttachList: array of pchar);stdcall;
//这个函数即是我们需要回调的函数体
以上的过程相当于一个循环:主程序调用DLL函数,DLL函数再次调用主程序的回调函数
主程序中定义的回调函数要注意位置,由于dll需要取得回调函数的地址,如果回调函数是声明在类
中的话,取地址会比较麻烦,所以这里的回调函数体的实现是在类以外的。
相关文章推荐
- Delphi 调用DLL外部函数时的指针参数
- Delphi使用C++库,向库中函数传递回调函数指针的问题解决
- delphi中函数指针的使用
- delphi中用代码实现注册Ocx和Dll(有点怪异,使用CallWindowProc来调用指定函数DllRegisterServer)
- Delphi中函数指针的使用
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 使用dumpbin命令查看dll导出函数及重定向输出到文件
- 笔记三:const 在变量、函数、指针中的使用
- delphi 回调函数与函数指针
- 通过函数指针动态调用 dll 中的函数
- 使用指向函数的指针
- 返回值是函数指针的函数使用方法
- delphi 函数指针
- 使用指针表示引用类型描述函数内指针重定向的行为
- Delphi下使用指针的简单总结
- 类模板 函数指针 function函数 bind,线程池 lambda函数的使用
- 指向函数的指针定义与使用
- c/c++使用指针做函数返回值和指针作函数参数问题
- 关于 Delphi 中流的使用(9) 分割与合并文件的函数
- DELPHI如何使用指针