欢迎来到天天文库
浏览记录
ID:47886027
大小:73.87 KB
页数:4页
时间:2019-08-07
《Inno Setup入门(15)—DLL外部库调用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、这里讲讲如何调用dll中的函数。先来一个简单的例子:[code]varmyPage:TWizardPage;Button:TNewButton;Cnt:Integer;functionGetCurrentProcessId():Integer;external'GetCurrentProcessId@C:WindowsSystem32kernel32.dll';procedureButtonOnClick(Sender:TObject);begin MsgBox(IntToStr(GetCurrentProcessId()),mbInformation,mb_Ok); end;p
2、rocedureInitializeWizard();beginmyPage:=CreateCustomPage(wpWelcome,'标题:自定义页面','描述:这是我的自定义页面');Button:=TNewButton.Create(mypage);Button.Width:=ScaleX(75);Button.Height:=ScaleY(23);Button.Caption:='TNewButton';Button.OnClick:=@ButtonOnClick;Button.Parent:=mypage.Surface;end;运行效果如下:语句:functionGetCu
3、rrentProcessId():Integer;external'GetCurrentProcessId@C:WindowsSystem32kernel32.dll';申明了引用dll的文件、函数和定义的函数。许多程序在安装过程中,会有升级的可能,但是又有个问题就是,当前的程序正在运行,这样就不能达到升级的效果,因此有必要坚持并能够结束指定程序的过程,如何在安装包中实现呢?其实很简单,就是调用dll,关于dll,可以用C++或者VB编写,个人推荐用C++,这样编写的dll文件似乎在数据类型上能够和pascal更好地融合,代码很简单,这里我就不啰嗦了,把重点集中到调用上,下面是一
4、个例子:[code]var myPage:TWizardPage; Button:TNewButton;functionGetPIDByName(pname:string):Integer;external'GetPIDByName@F:CollInnoKP.dllcdeclsetuponly'; functionKillProcess(pid:DWORD):Integer;external'KillProcess@F:CollInnoKP.dllcdeclsetuponly'; procedureButtonOnClick(Sender:TObject);begi
5、n KillProcess(GetPIDByName('qq.exe'));end;procedureInitializeWizard();begin myPage:=CreateCustomPage(wpWelcome,'标题:自定义页面','描述:这是我的自定义页面'); Button:=TNewButton.Create(mypage); Button.Width:=ScaleX(75); Button.Height:=ScaleY(23); Button.Caption:='TNewButton'; Button.OnClick:=@ButtonOnClick;
6、 Button.Parent:=mypage.Surface;end;程序中引入了KP.dll中的两个函数,分别是通过进程名称获取其pid,以及结束指定pid的进程,在这个例子中,点击按钮就会结束QQ的进程。请注意调用过程如果写的函数没自己处理好堆栈问题,则必须使用cdecl 方式,而不是默认方式的stdcall,否则可能会出现如下错误: 这就是调用方式不对造成的结果,这一点需要格外留心。概述前面分两节介绍了如何使用dll,这里将对调用外部或者系统dll做一些综述。Pascal脚本能调用外部dll(标准Win32API或者各程序员编写的dll)中的函数,在调用外部dll中的函数前,需要
7、声明所调用的函数原型,使用external声明dll文件,对于一个Pascal描述的函数原型,例如functionA(B:Integer):Integer;可以有三种方式调用:方法一:functionA(B:Integer):Integer;external'< dll中函数名称> >@< dll文件路径 >';方法二:functionA(B:Integer):Integer;external'< dll中函数名称> >@< dll文件路径 >
此文档下载收益归作者所有