DLL笔记

转载 2006年05月26日 14:20:00

DLL笔记

 

下面以DLL简单程序的测试,来展示DLL的用法和各种注意点:

 

一个DLL程序:

 

library Project2;

 

uses

 

  SysUtils,Classes;

 

{$R *.res}

 

function Min(X, Y: Integer): Integer; stdcall;

 

begin

 

  if X < Y then Min := X else Min := Y;

 

end;

 

function Max(X, Y: Integer): Integer; stdcall;

 

begin

 

  if X > Y then Max := X else Max := Y;

 

end;

 

exports

 

  Min,

 

  Max;

 

begin

 

end.

 

l         一个调用程序:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

 

var

 

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function Min(X, Y: Integer): Integer; stdcall; external DLL;

 

function Max(X,Y:Integer):Integer; stdcall; external DLL;

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

输出结果当然是3

 

l         另一个调用程序:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

function Min(X, Y: Integer): Integer; stdcall; external DLL;

 

function Max(X, Y: Integer): Integer; stdcall; external DLL;

 

 

var

 

  Form1: TForm1;

 

 

implementation

 

 

{$R *.dfm}

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

输出结果也是3

 

结论:无论在Interface还是implementation部分声明,都可以,但区别当然也是很明显的,声明在Interface的可以被其他单元调用,而声明在implementation的,只能在自己的单元中被调用。要可以被其他单元调用,还有别一种形式,代码如下:

 

unit DLLTest;

 

 

interface

 

 

uses

 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 

  Dialogs, StdCtrls;

 

const

 

  DLL='project2.DLL';

 

 

type

 

  TForm1 = class(TForm)

 

    Button1: TButton;

 

    Edit1: TEdit;

 

    procedure Button1Click(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

function Min(X, Y: Integer): Integer; stdcall;

 

function Max(X, Y: Integer): Integer; stdcall;

 

 

var

 

  Form1: TForm1;

 

 

implementation

 

 

{$R *.dfm}

 

 

function Min; external DLL;

 

function Max; external DLL;

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

begin

 

  Edit1.Text:=IntToStr(Min(3,5));

 

end;

 

 

end.

 

l         将其中一个函数的大小写变一下:

 

function min(X, Y: Integer): Integer; stdcall; external DLL;

 

程序出现错误,说明对于DLL的函数声明是大小写敏感的。

 

l         现在将DLL文件的Exports块修改如下:

 

exports

 

  Min name ‘Max’,

 

  Max name ‘Min’;

 

再将上面调用程序运行一遍,输出结果是5,说明,如上声明之后,在DLL程序中的Min函数,它输出为Max了,而Max则输输出为Min了。

 

l         再将Exports块改为如下形式:

 

exports

 

  Min name index 1,

 

  Max name index 2;

 

再将调用程序的的声明变为如下:

 

function Min; external DLL index 2;

 

//function Max; external DLL;

 

运行结果为5,则说明当DLL程序声明Index后,外部程序调用时如果也用Index,则调用DLL哪个函数由Index来决定。如果DLL没有在函数输出后面加Index,则外部程序加上Index无效。

 

l         将调用程序的函数声明变为如下:

 

function Min; external DLL name 'Max';

 

function Max; external DLL name 'Min';

 

则程序运行结果是5,说明如果用了name,则外部函数实际对应的是DLL中和Name后面的字符串相同的函数,大小敏感。

 

 

 

{三}C基本类型与Delphi类型的对应

 

//整型

 

INT64 = Int64       有符号64位整数

 

INT = Integer       有符号32位整数

 

LONG = Longint      有符号32位整数

 

WPARAM = Longint   有符号32位整数

 

LPARAM = Longint   有符号32位整数

 

LRESULT = Longint  有符号32位整数

 

HANDLE = Loingint  有符号32位整数

 

UINT = LongWord    无符号32位整数

 

DWORD = DWORD       无符号32位整数

 

SHORT = Smallint   有符号16位整数

 

WORD = Word         无符号16位整数

 

BYTE = Byte         无符号8位整数

 

 

//浮点型

 

FLOAT = Single     4个字节

 

DOUBLE = Double    8个字节

 

 

//字符型

 

CHAR = Char

 

WCHAR = WideChar;

 

PWChar = PWideChar;

 

LPSTR = PAnsiChar;

 

LPCSTR = PAnsiChar;

 

LPCTSTR = PAnsiChar;

 

LPTSTR = PAnsiChar;

 

LPWSTR = PWideChar;

 

LPCWSTR = PWideChar;

 

 

//布尔型

 

BOOL = LongBool;   4个字节

 

bool = Boolean;    1个字节

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DLL笔记

引言   动态链接库(DLL)是WINDOWS平台的基础,Windows API 中的所有函数都包含在D L L中。有3个最重要的D L L是K e r n e l 3 2 . d l l,它包含...
  • vlily
  • vlily
  • 2011年10月20日 16:08
  • 425

dll笔记

int main() {     typedef void(*func)();     HINSTANCE h = LoadLibraryEx(_T("dlltest.dll"), NULL, ...
  • zheng2263
  • zheng2263
  • 2016年04月26日 22:41
  • 100

C++如何写一个简单的DLL文件

这个东西其实挺简单的,刚开始写的时候,是在VC的编译器上,按照前人的步骤,老失败,折腾我一天了,结果,我换了个编译器,在vs08的平台上,就成功了,好了,不多少了,分享一下: 首先建立一个MyDll...
  • ganpengjin1
  • ganpengjin1
  • 2012年12月09日 20:02
  • 13511

用VS2010将C程序做成动态链接库dll

/* 一直在做linux编程,突然要移植到windows,摸索了好久,记录下,分三篇来记录: 1.用vs2010将C做成dll 2.c#做界面后,如何调用C语言函数/dll 3.c#程序的打包...
  • leo9150285
  • leo9150285
  • 2013年04月16日 13:41
  • 5635

Windows DLL开发笔记

Windows DLL开发笔记
  • daoming1112
  • daoming1112
  • 2017年01月24日 00:07
  • 91

DLL编程笔记

第1课 DLL基础 一、静态链接库(Static Link Library) 程序员们把常用的代码集合放进独立的文件里,这样的文件就叫做库。在写程序的时候,把这个库文件加入编译器,就能够使用这个库...
  • coperator
  • coperator
  • 2013年06月07日 18:16
  • 701

MyGui笔记(1)建立第一个工程

记录下学习​MyGui的一些笔记,从建立第一个工程开始。 步骤: 1.右键MYGUI解决方案,添加→新建项目,选择“Win32 项目”,名称为:TestHello。下一步,勾选“空项目”。 2.设置...
  • akof1314
  • akof1314
  • 2013年09月18日 12:58
  • 6951

DLL开发笔记

DLL(Dynamic Linkable Library)动态链接库 1、使用动态链接库的优点: (1)减少内存空间要求:应用程序在运行时,只有当EXE程序确定要调用某些DLL模块时,系统才将...
  • woshishantao
  • woshishantao
  • 2012年08月17日 11:09
  • 243

DLL技术笔记(1)

DLL技术笔记由于学习DLL时,没有例子的帮助是很难了解DLL的精髓,现在我想做一个例子来介绍:一、在DLL里面加一个函数:fun(double a,double b)//这里我懒得打字,就剽窃别人(...
  • sgnah
  • sgnah
  • 2005年03月26日 10:04
  • 933

DLL学习开发笔记

一、生成DLL1、用VC建立一个Win32DLL工程--DllTest,选上“导出符号”;     具体如下 : file -> new -> project -> Win32 Dynamic-lin...
  • neu_solskjaer
  • neu_solskjaer
  • 2007年09月02日 11:27
  • 905
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL笔记
举报原因:
原因补充:

(最多只允许输入30个字)