本例用delphi 7 编写
编写DLL就要遵守DLL规则。DLL规则,可以简单地理解为 windows 规则。(以后简称 win 规则)
对于DLL函数的String参数,要特别设计。
先来看GetWindowText这个Win函数的调用方法
~~~
procedure TForm1.Button1Click(Sender: TObject);
// 本例为 D7, Char 默认是 AnsiChar
var
Buff: array[0..255] of char; //定义一块内存,用于存放Window的标题。
sWndText: string;
begin
ZeroMemory(@Buff, 256); // Buff 清零,避免不必要的麻烦。
GetWindowText(self.Handle, Buff, 256); // 告诉函数,我提供了 256 个字节的 buff 供其使用。
sWndText := Buff; // 此句等价于 sWndtext:=String(PChar(@buff));
DispMsg(sWndText); // 输出结果是 Form1
end;
~~~
为了调用此函数,我们先定义了一块内存供函数使用,此为Win规则的推荐写法。
为什么要这样设计?这涉及到内存分配与释放的问题。
由调用者提供BUFF与长度,在DLL函数中使用此块内存,并由长度来控制边界,
让内存的归属问题变得简单清晰。
好,下面我们来设计一个DLL函数:
菜单: File-->New-->Other... 切换到 New 标签,选择 DLL Wizard 再点击 OK ,即可新建一个DLL工程。
~~~
library TestDLL;
uses
SysUtils, Classes;
{$R *.res}
// 本函数将Str反转。如: abc 变成 cba
procedure ReverseStr(AInStr, AOutStr: PChar; ACount: integer); stdcall;
var
i: integer;
begin
inc(AInStr, ACount - 1);
for i := 0 to ACount - 1 do
begin
AOutStr^ := AInStr^;
Dec(AInStr);
inc(AOutStr);
end;
end;
exports // 输出函数申明
ReverseStr;
begin
end.
~~~
写好代码,编译后就可以得到 TestDLL.dll
再编写一个调用此DLL函数的EXE工程。
~~~
// 虽然 delphi 对函数名大小写不敏感
// 但是:在申明DLL函数的时候,大小写一定要与DLL中的定义相同。
// 即此处 ReverseStr 不可写成 reversestr
procedure ReverseStr(AInStr, AOutStr: PChar; ACount: integer); stdcall; external 'TestDLL.dll'; // 申明DLL
procedure TForm1.Button2Click(Sender: TObject);
var
sInStr: string;
sOutStr: string;
n: integer;
begin
sInStr := 'abcdefghijklmno';
n := Length(sInStr);
SetLength(sOutStr, n); // 给 sOutStr 分配空间
ReverseStr(PChar(sInStr), PChar(sOutStr), n);
DispMsg(sOutStr); // 输出结果:onmlkjihgfedcba
end;
~~~
[本例源码下载](https://www.jianguoyun.com/p/DbrONaMQxMf4BRjK1zs)
- 0.1 教程说明
- 0.2 delphi xe8 安装
- 0.2.2 XE 10.3.3 安装
- 0.3 delphi IDE 的非常必要的配置
- 0.4 调试中的异常处理
- 0.5 工程路径设置
- 0.6 开发工具界面切换成中文的问题
- 一、实用技巧
- 0.尝试为event取名叫伊文特
- 1.各种(变量)数据在内存中是什么样子的?
- 2
- 3
- 4.乱码问题
- 5
- 二、多线程
- 三、DLL相关
- 1.DLL中函数参数如何设计?
- 2.调用易语言DLL识别验证码
- 四、界面设计
- 1.关于解耦问题
- 2.登录功能设计
- 五、面向对象基础知识
- 1.窗口间传递值
- 3.避免又臭又长的裹脚布
- 2.扩展 TStringGrid , delphi 7 示例
- 六、初学者误区集锦
- 七 TList 集合
- 1.附加信息Pointer设计
- 2.用 TList 来建立组件间的联系
- 3.泛型 TList<T> 示例