delphi之调用外部dll中的函数

合集下载

Delphi打开外部程序或文件的方法与命令

Delphi打开外部程序或文件的方法与命令

Delphi打开外部程序或文件的方法与命令ShellExecute(hWnd: HWND; {指定父窗口句柄}Operation: PChar; {指定动作, 譬如: open、print}FileName: PChar; {指定要打开的文件或程序}Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是nil} Directory: PChar; {缺省目录}ShowCmd: Integer {打开选项}): HINST; {执行成功会返回应用程序句柄; 如果这个值<= 32, 表示执行错误}//返回值可能的错误有:= 0 {内存不足}ERROR_FILE_NOT_FOUND = 2; {文件名错误}ERROR_PATH_NOT_FOUND = 3; {路径名错误}ERROR_BAD_FORMAT = 11; {EXE 文件无效}SE_ERR_SHARE = 26; {发生共享错误}SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}SE_ERR_DDETIMEOUT = 28; {超时}SE_ERR_DDEFAIL = 29; {DDE 事务失败}SE_ERR_DDEBUSY = 30; {正在处理其他DDE 事务而不能完成该DDE 事务} SE_ERR_NOASSOC = 31; {没有相关联的应用程序}//ShowCmd参数可选值:SW_HIDE = 0; {隐藏}SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}SW_NORMAL = 1; {同SW_SHOWNORMAL}SW_SHOWMINIMIZED = 2; {最小化, 激活}SW_SHOWMAXIMIZED = 3; {最大化, 激活}SW_MAXIMIZE = 3; {同SW_SHOWMAXIMIZED}SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活}SW_SHOW = 5; {同SW_SHOWNORMAL}SW_MINIMIZE = 6; {最小化, 不激活}SW_SHOWMINNOACTIVE = 7; {同SW_MINIMIZE}SW_SHOWNA = 8; {同SW_SHOWNOACTIVATE}SW_RESTORE = 9; {同SW_SHOWNORMAL}SW_SHOWDEFAULT = 10; {同SW_SHOWNORMAL}SW_MAX = 10; {同SW_SHOWNORMAL}--------------------------------------------------------------------------------//举例说明更多问题(别忘了uses ShellAPI;):{譬如用记事本打开一个文件}beginShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{第一个参数是用来当作错误提示窗口的父窗口的, 不能是nil, 可以是0(也就是桌面窗口)} beginShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;--------------------------------------------------------------------------------{第二个参数如果是nil, 也会默认位open}beginShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{文件路径可以放在参数五}beginShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{把参数三直接指定为要打开的文件, 文件将用对应默认程序打开; 次数参数四应为nil} beginShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{如果文件在: 程序目录/当前目录/System32/Windows/PATH环境变量中, 参数五也可以nil} beginShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{如果参数三是个文件, 可以用参数二命令打印}beginShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1);end;--------------------------------------------------------------------------------{用IE 打开网页}beginShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{用火狐打开网页}beginShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------来源:(/s/blog_4b05f08e0100h5py.html) - Delphi打开外部程序或文件_漂忆_新浪博客{用默认浏览器打开网页}beginShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{还是用默认浏览器打开网页}beginShellExecute(0, nil, '', nil, nil, 1);end;Delphi技巧集六(等待执行完一个外部程序再执行另一个程序)Posted on 2008-08-10 23:20 清枫&明月阅读(80) 评论(0) 编辑收藏网摘所属分类: Delphi编程资料unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementationuses ShellAPI; //注意{$R *.dfm}functionExecAppWait(AppName, Params: string): Boolean;varShellExInfo: TShellExecuteInfo;beginFillChar(ShellExInfo, SizeOf(ShellExInfo), 0);withShellExInfo do begincbSize := SizeOf(ShellExInfo);fMask := see_Mask_NoCloseProcess;Wnd :=Application.Handle;lpFile := PChar(AppName);lpParameters := PChar(Params);nShow := sw_ShowNormal;end;Result :=ShellExecuteEx(@ShellExInfo);if Result thenwhileWaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do beginApplication.ProcessMessages;ifApplication.Terminated then Break;end;end;procedure TForm1.Button1Click(Sender: TObject);const { 连续运行下面这四个EXE文件}EXEFILES : array[1..4] of string =('calc.exe', 'mspaint.exe', 'Notepad.exe', 'wordpad.exe'); varSuccess: Boolean;InstanceID: THandle;I : integer;beginfor I := Low(EXEFILES) to High(EXEFILES) dobeginApplication.Minimize;Success := False;trySuccess :=ExecAppWait(EXEFILES[I], '')finallyApplication.Restore;if not Success thenShowMessage(Format('Application %d failed: %s', [ I, EXEFILES[I] ])); end;end;end;end.。

如何在DELPHI中调用外部程序

如何在DELPHI中调用外部程序

如何在Delphi中调用外部程序本实例介绍如何在自己的程序中调用指定的Windows程序。

首先启动一个新的项目,在空白的窗体上添加4个TButton组件。

添加组件后的窗体如图1所示。

图1添加组件后的窗体其中WinExec按钮用于以WinExec函数来调用指定的Windows程序。

ShellExecute按钮用于以ShellExecute函数来调用指定的Windows程序。

CreateProcess按钮和TerminateProcess按钮用于实现对被调用程序更全面的操作,前者用于调用指定的Windows 程序,而后者则用于终止被调用的Windows程序。

以WinExec函数的方式来调用指定的Windows程序的响应代码如下:其中WinExec函数的第1个参数表示了被调用程序的路径和名称,第2个参数表示了程序的显示方式。

以ShellExecute函数的方式来调用指定的Windows程序的响应代码如下:其中ShellExecute用于打开与指定文件关联在一起的程序文件。

第1个参数用于指定一个窗口的句柄;第2个参数指定了程序运行的类别,如’Open’或’Print’;第3个参数指定了想用关联程序打印或打开的一个程序名或文件名;如果第3个参数中指定了一个可执行文件,那么第4个参数就是传递给执行程序的参数;第5个参数指定了可执行程序的完整路径。

最后一个参数用于设定程序运行方式。

下面来介绍利用CreateProcess函数和TerminateProcess函数如何实现对被调用程序更全面的操作。

首先定义3个全局变量:利用CreateProcess函数调用指定程序的响应代码如下:调用CreateProcess函数激活C:\WINNT\Notepad.exe程序后,把它的进程信息存储在变量PI中,然后通过下面的语句来关闭本实例打开的C:\WINNT\Notepad.exe程序:程序代码如下:保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。

Delphi调用外部程序详解[宝典]

Delphi调用外部程序详解[宝典]

Delphi调用外部程序详解Delphi调用外部程序详解(Shellexecute,Winexec)2008-10-0411:27Delphi调用外部程序详解WinExec主要运行EXE文件。

如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。

首先必须引用shellapi.pas单元:uses ShellAPI;1.标准用法ShellExecute函数原型及参数含义如下:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;●hWnd:用于指定父窗口句柄。

当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。

例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。

●Operation:用于指定要进行的操作。

其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。

当参数设为nil时,表示执行默认操作“open”。

●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。

●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。

●Directory:用于指定默认目录。

●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。

delphi 调用dll struct 参数

delphi 调用dll struct 参数

标题:Delphi中使用DLL调用及结构参数传递的方法一、引言在Delphi中,我们经常需要使用动态信息库(DLL)来实现对外部功能的调用。

而在调用DLL时,有时需要传递结构参数,本文将介绍在Delphi中使用DLL进行结构参数传递的方法。

二、调用DLL1. 静态信息和动态信息在Delphi中,我们可以通过静态信息和动态信息两种方式调用DLL。

静态信息是将DLL文件直接嵌入到可执行文件中,而动态信息则是在程序运行时加载DLL文件。

一般来说,动态信息是更为常用的方式。

2. 使用动态信息调用DLL在Delphi中使用动态信息调用DLL,一般需要使用`LoadLibrary`函数加载DLL文件,然后使用`GetProcAddress`函数获取DLL中的函数位置区域,最后通过指针调用DLL函数。

示例代码如下:```delphivarhDLL: THandle; // DLL句柄addFunc: function(a, b: Integer): Integer; stdcall; // DLL函数指针beginhDLL := LoadLibrary('MyDll.dll'); // 加载DLLif hDLL <> 0 thenbegin@addFunc := GetProcAddress(hDLL, 'Add'); // 获取DLL中的Add函数位置区域if Assigned(addFunc) thenbegin// 调用DLL函数Result := addFunc(1, 2);end;FreeLibrary(hDLL); // 释放DLLend;end;```三、结构参数传递在DLL调用中,有时我们需要传递结构参数,即将自定义的结构体作为函数参数传递给DLL中的函数。

下面将介绍在Delphi中如何实现结构参数的传递。

1. 定义结构体我们需要在Delphi中定义需要传递的结构体。

Delphi中的函数调用模式

Delphi中的函数调用模式

Delphi中的函数调用模式在用Delphi3 0开发软件时,出现了硬件驱动程序(DLL)中的函数和过程不能正常调用的问题,该硬件由英国Schlumberger公司生产,驱动程序用汇编语言编写的。

其《编程指南》给出的Microsoft C的示范程序均能正常运行。

但运行此软件时现出的错误提示为:Access violationat address XXXXXXXX in module'…·经仔细分析,才发现问题出现在函数调用模式上Delphi3 0支持五种调用模式:register、cdec L pascal、stdcall和safecall0 根据调用模式的不同,参数可以通过CPU的寄存器或堆校传递给函数和过程。

reg ister模式使用CPU的三个寄存器传递参数,而其它模式则用堆校来传递参数。

在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。

另三种模式cdecl、std call和Jsafecall则从右至左传递参数。

这些模式中除了cd ecl外,都是由过程和函数在返回时清除堆校中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆校中的参数。

如何选择调用模式,有以下三条规则:1 Delphi30使用register模式作为缺省调用模式以提高运行效率。

2 如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。

3 如果要实现双界面函数和过程,应使用safec all模式。

所以解决我们的问题只要选用stdcall模式即可Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:void(FAR PASCAL 士Imp Connect)(unsigned s hortfar士,shortfar士);void(FAR PASCAL 士Imp Init)(shortfar士,s hortfar士);相应的在Delphi30下DLL函数引入说明为:procedure ImpConnect(var Car dA ddress:wor d; varCardHandle:smallint);stdcall;procedure Imp Init(varPollTab:smallint;var ErrorFlag:smallint;var Car dH andle:smallint);st dcal l;这样修改以后,程序即可正常运行(原来我们没有说明调用模式,即使用缺省的register模式),由此我们也可得出个经验:对些高版本的新软件,使用时要注意改进和扩充,并经常看看帮助文件,定会大有禅益。

Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例。

一、动态链接库的概念动态链接库( Dynamic Link Library ,缩写为 DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接库文件的扩展名一般是 dll ,也有可能是 drv 、 sys 和 fon ,它和可执行文件( exe )非常类似,区别在于 DLL 中虽然包含了可执行代码却不能单独执行,而应由 Windows 应用程序直接或间接调用。

动态链接是相对于静态链接而言的。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

换句话说,函数和过程的代码就在程序的 exe 文件中,该文件包含了运行时所需的全部代码。

当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。

仅当应用程序被装入内存开始运行时,在 Windows 的管理下,才在应用程序与相应的 DLL 之间建立链接关系。

当要执行所调用 DLL 中的函数时,根据链接产生的重定位信息, Windows 才转去执行 DLL 中相应的函数代码。

一般情况下,如果一个应用程序使用了动态链接库, Win32 系统保证内存中只有 DLL 的一份复制品,这是通过内存映射文件实现的。

DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个 DLL 的进程地址空间。

在 Win32 系统中,每个进程拥有自己的 32 位线性地址空间,如果一个 DLL 被多个进程调用,每个进程都会收到该 DLL 的一份映像。

Delphi下DLL调用以及共享数据库连接

Delphi下DLL调用以及共享数据库连接
if @p<>nil then
p(parameter) //调用Dll.含参数。
else
begin
strpcopy(b,'Method Not Defined: '+modulename+'!');
messagebox(message_parameter.mainhandle,b,
第二种:外部函数引用
做一个单元(unit),引用外部函数。例如:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' name 'mydllpro';
依赖于DLL接口输出方式,或者写成:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' index my_index;
process_cancel_service_form.showmodal;
process_cancel_service_form.free;
end;
(******************************)
exports
run_cancel_service;
begin
b,'Error...',mb_ok or mb_iconexclamation);
end;
end;
说明:如果你有一个dll是这么写的,
library cancel_service;
uses

在DELPHI中静态调用DLL

在DELPHI中静态调用DLL

一、开始你的第一个DLL专案1.File->Close all->File->New﹝DLL﹞代码://自动产生Code如下library Project2;//这有段废话usesSysUtils,Classes;{$R*.RES}beginend.2.加个Function进来:代码:library Project2;usesSysUtils,Classes;Function MyMax(X,Y:integer):integer;stdcall; beginif X>Y thenResult:=XelseResult:=Y;end;//切记:Library的名字大小写没关系,可是DLL-Func的大小写就有关系了。

//在DLL-Func-Name写成MyMax与myMAX是不同的。

如果写错了,立即//的结果是你叫用到此DLL的AP根本开不起来。

//参数的大小写就没关系了。

甚至不必同名。

如原型中是(X,Y:integer)但引//用时写成(A,B:integer),那是没关系的。

//切记:要再加个stdcall。

书上讲,如果你是用Delphi写DLL,且希望不仅给//Delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall;的指示//参数型态:Delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的//,Windows/DLL的母语应该是C。

所以如果要传进传出DLL的参数,我们//尽可能照规矩来用。

这两者写起来,后者会麻烦不少。

如果你对C不熟//的话,那也没关系。

我们以后再讲。

{$R*.RES}beginend.3.将这些可共享的Func送出DLL,让外界﹝就是你的Delphi-AP啦﹞使用:光如此,你的AP还不能用到这些,你还要加个Exports才行。

代码:{$R*.RES}exportsMyMax;beginend.二、进行测试:开个新application:1.加个TButton代码:ShowMessage(IntToStr(MyMax(30,50)));2.告知Exe到那里抓个Func代码://在Form,interface,var后加Function MyMax(X,Y:integer):integer;stdcall;external'MyTestDLL.dll';//MyTestDLL.dll为你前时写的DLL项目名字//DLL名字大小写没关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分早绑定和晚绑定两种。

早绑定的代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//MB 函数的声明:
function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
implementation
{$R *.dfm}
{调用外部 DLL 中的函数,譬如调用系统 user32.dll 中的 MessageBoxA}
//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external user32 name 'MessageBoxA';
{其中 user32 是 Delphi 定义的常量 'user32.dll',可以直接写成:}
//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external 'user32.dll' name 'MessageBoxA';
{name 后面说明函数的真实名字}
{external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用LoadLibrary}
{stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器
传递}
{4个参数的数据类型可以使用对应的 Delphi 数据类型,譬如:}
//function MB(hWnd: LongWord; lpText, lpCaption: PChar; uType: LongWord): Integer;
// stdcall; external 'user32.dll' name 'MessageBoxA';
{或者是:}
//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;
// stdcall; external 'user32.dll' name 'MessageBoxA';
{如果函数在此单元声明后,需要给其他单元调用,需要先在 interface 区声明:} //function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;
// stdcall;
{本例已经这样做了,如果要测试其他几种情况,需要先注释掉它}
{然后在 implementation 区,说明函数的来源:}
function MB; external 'user32.dll' name 'MessageBoxA';
//调用测试:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0,b,t,0);
end;
end.
晚绑定的例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
//晚绑定,也就是动态调用外部函数主要用以下三个命令:
//LoadLibrary:获取 DLL
//GetProcAddress:获取函数
//FreeLibrary:释放
//定义一个过程类型,参数要和需要的函数一致
TMB = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MB: TMB; {声明函数 MB}
inst: LongWord; {声明一个变量来记录要使用的 DLL 句柄}
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
inst := LoadLibrary('user32.dll');
if inst <> 0then
MB := GetProcAddress(inst, 'MessageBoxW');
// MB := GetProcAddress(inst, 'MessageBoxA'); {Delphi 2009 之前的版本用这句}
end;
//调用测试:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0, b, t, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(inst); {记得释放}
end;
end.
创建并调用dll
//通过 DLL Wizard 建立:
library TestDLL;
uses
SysUtils,
Classes,
Dialogs;
{$R *.res}
//建立过程
procedure Test;
begin
ShowMessage('TestDLL.Test');
end;
//输出
exports
Test;
begin
end.
//在其他工程调用,如果不在一个工程组,需要在相同目录下、System32下或指定路径;
//声明可以在实现区或接口区,这里的函数名要一致,甚至大小写。

//调用测试:
procedure Test; external 'TestDLL.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
Test; end;。

相关文档
最新文档