阿杰 发表于 2009-7-26 13:57:36

【分享】Delphi 调用外部Dll函数

<span class="k"><strong><font color="#000080">unit</font></strong></span> Unit1;<br/><br/><span class="k"><strong><font color="#000080">interface</font></strong></span><br/><br/><span class="k"><strong><font color="#000080">uses</font></strong></span><br/>Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br/>Dialogs, StdCtrls;<br/><br/><span class="k"><strong><font color="#000080">type</font></strong></span><br/>TForm1 = <span class="k"><strong><font color="#000080">class</font></strong></span>(TForm)<br/>&nbsp;&nbsp;&nbsp; Button1: TButton;<br/>&nbsp;&nbsp;&nbsp; <span class="k"><strong><font color="#000080">procedure</font></strong></span> Button1Click(Sender: TObject);<br/><span class="k"><strong><font color="#000080">private</font></strong></span><br/>&nbsp;&nbsp;&nbsp; <span class="g"><font color="#008000">{ Private declarations }</font></span><br/><span class="k"><strong><font color="#000080">public</font></strong></span><br/>&nbsp;&nbsp;&nbsp; <span class="g"><font color="#008000">{ Public declarations }</font></span><br/><span class="k"><strong><font color="#000080">end</font></strong></span>;<br/><br/><span class="k"><strong><font color="#000080">var</font></strong></span><br/>Form1: TForm1;<br/><br/><span class="g"><font color="#008000">//MB 函数的声明:<br/></font></span><span class="k"><strong><font color="#000080">function</font></strong></span> MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; <span class="k"><strong><font color="#000080">stdcall</font></strong></span>;<br/><br/><span class="k"><strong><font color="#000080">implementation</font></strong></span><br/><br/><span class="t"><font color="#008284">{$R *.dfm}</font></span><br/><span class="g"><font color="#008000">{调用外部 DLL 中的函数,譬如调用系统 user32.dll 中的 MessageBoxA}</font></span><br/><span class="g"><font color="#008000">//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;<br/></font></span><span class="g"><font color="#008000">// stdcall; external user32 name 'MessageBoxA';<br/></font></span><br/><span class="g"><font color="#008000">{其中 user32 是 Delphi 定义的常量 'user32.dll',可以直接写成:}</font></span><br/><span class="g"><font color="#008000">//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;<br/></font></span><span class="g"><font color="#008000">// stdcall; external 'user32.dll' name 'MessageBoxA';<br/></font></span><br/><span class="g"><font color="#008000">{name 后面说明函数的真实名字}</font></span><br/><span class="g"><font color="#008000">{external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用 LoadLibrary}</font></span><br/><span class="g"><font color="#008000">{stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器传递}</font></span><br/><br/><span class="g"><font color="#008000">{4个参数的数据类型可以使用对应的 Delphi 数据类型,譬如:}</font></span><br/><span class="g"><font color="#008000">//function MB(hWnd: LongWord; lpText, lpCaption: PChar; uType: LongWord): Integer;<br/></font></span><span class="g"><font color="#008000">// stdcall; external 'user32.dll' name 'MessageBoxA';<br/></font></span><br/><span class="g"><font color="#008000">{或者是:}</font></span><br/><span class="g"><font color="#008000">//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;<br/></font></span><span class="g"><font color="#008000">// stdcall; external 'user32.dll' name 'MessageBoxA';<br/></font></span><br/><span class="g"><font color="#008000">{如果函数在此单元声明后,需要给其他单元调用,需要先在 interface 区声明:}</font></span><br/><span class="g"><font color="#008000">//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;<br/></font></span><font color="#008000"><span class="g">// stdcall;<br/></span><span class="g">{本例已经这样做了,如果要测试其他几种情况,需要先注释掉它}</span></font><br/><span class="g"><font color="#008000">{然后在 implementation 区,说明函数的来源:}</font></span><br/><span class="k"><strong><font color="#000080">function</font></strong></span> MB; <span class="k"><strong><font color="#000080">external</font></strong></span> <span class="b"><font color="#0000ff">'user32.dll'</font></span> name <span class="b"><font color="#0000ff">'MessageBoxA'</font></span>;<br/><br/><span class="g"><font color="#008000">//调用测试:<br/></font></span><span class="k"><strong><font color="#000080">procedure</font></strong></span> TForm1<span class="b"><font color="#0000ff">.</font></span>Button1Click(Sender: TObject);<br/><span class="k"><strong><font color="#000080">var</font></strong></span><br/>t,b: PChar;<br/><span class="k"><strong><font color="#000080">begin</font></strong></span><br/>t := <span class="b"><font color="#0000ff">'标题'</font></span>;<br/>b := <span class="b"><font color="#0000ff">'内容'</font></span>;<br/>MB(<span class="b"><font color="#0000ff">0</font></span>,b,t,<span class="b"><font color="#0000ff">0</font></span>);<br/><span class="k"><strong><font color="#000080">end</font></strong></span>;<br/><br/><span class="k"><strong><font color="#000080">end</font></strong></span>.<br/>
页: [1]
查看完整版本: 【分享】Delphi 调用外部Dll函数