Inno Setup入门(15)—DLL外部库调用.docx_第1页
Inno Setup入门(15)—DLL外部库调用.docx_第2页
Inno Setup入门(15)—DLL外部库调用.docx_第3页
Inno Setup入门(15)—DLL外部库调用.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这里讲讲如何调用dll中的函数。先来一个简单的例子:codevar myPage:TWizardPage; Button :TNewButton; Cnt:Integer;function GetCurrentProcessId(): Integer;external GetCurrentProcessIdC:WindowsSystem32kernel32.dll;procedure ButtonOnClick(Sender: TObject);begin MsgBox(IntToStr(GetCurrentProcessId(), mbInformation, mb_Ok);end;procedure InitializeWizard();begin myPage:=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;运行效果如下:语句:function GetCurrentProcessId(): Integer;external GetCurrentProcessIdC:WindowsSystem32kernel32.dll;申明了引用dll的文件、函数和定义的函数。许多程序在安装过程中,会有升级的可能,但是又有个问题就是,当前的程序正在运行,这样就不能达到升级的效果,因此有必要坚持并能够结束指定程序的过程,如何在安装包中实现呢?其实很简单,就是调用dll,关于dll,可以用C+或者VB编写,个人推荐用C+,这样编写的dll文件似乎在数据类型上能够和pascal更好地融合,代码很简单,这里我就不啰嗦了,把重点集中到调用上,下面是一个例子:codevar myPage:TWizardPage; Button :TNewButton;function GetPIDByName(pname:string):Integer;external GetPIDByNameF:CollInnoKP.dll cdecl setuponly; function KillProcess(pid:DWORD):Integer;external KillProcessF:CollInnoKP.dll cdecl setuponly; procedure ButtonOnClick(Sender: TObject);begin KillProcess(GetPIDByName(qq.exe);end;procedure InitializeWizard();begin myPage:=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;程序中引入了KP.dll中的两个函数,分别是通过进程名称获取其pid,以及结束指定pid的进程,在这个例子中,点击按钮就会结束QQ的进程。请注意调用过程如果写的函数没自己处理好堆栈问题,则必须使用cdecl方式,而不是默认方式的stdcall,否则可能会出现如下错误:这就是调用方式不对造成的结果,这一点需要格外留心。概述前面分两节介绍了如何使用dll,这里将对调用外部或者系统dll做一些综述。Pascal脚本能调用外部dll(标准Win32 API或者各程序员编写的dll)中的函数,在调用外部dll中的函数前,需要声明所调用的函数原型,使用external声明dll文件,对于一个Pascal描述的函数原型,例如function A(B: Integer): Integer;可以有三种方式调用:方法一:function A(B: Integer): Integer;external ;方法二:function A(B: Integer): Integer;external ;方法三:function A(B: Integer): Integer;external ;第一种方法最简单,这是Pascal脚本的默认调用方法,调用约定为stdcall,绝大部分的调用都是采用这种方式,当然也可以使用其他的调用约定:cdecl、pascal和register最后一个选项指定了加载dll的方式,可以是下列几种:delayload通常,Pascal脚本会在开始的时候检验dll函数是否能够被调用,如果不能,则拒绝执行。为了避免这种现象,可以用该选项指定延迟加载,通常是当你不确定所调用的函数是否在运行时可用,但是这样做的后果就是,Pascal脚本会在不可用的情况下继续执行但是抛出异常。loadwithalteredsearchpath指明dll存放的文件夹,让加载器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论