Sign in Join
Wiki copytemporary

DLL dynamically load/zh CN: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: DLL dynamically load/zh CN

OldNewLine
1+这篇教程向你展示如何动态地加载一个DLL(动态链接库)。
2+
3+在下面的示例中将引用的DLL(在DLLTest.dll中的源文件):
4+
5+``` pascal
6+ library info;
7+
8+ {$mode objfpc} {$H+}
9+
10+ uses
11+ SysUtils;
12+
13+ {$R *.res}
14+
15+ // DLL文件中的子程序
16+ function funStringBack(strIn : string) : PChar;
17+ begin
18+ funStringBack := PChar(UpperCase(strIn));
19+ end ;
20+
21+ // 导出子程序
22+ exports
23+ funStringBack;
24+
25+ begin
26+ end.
27+```
28+
29+我应该做什么:
30+
31+- 定义存储器内存
32+ - 必需创建一个数据类型,这个数据类型必需与从DLL文件中所导入的(external)子程序的数据类型相一致。
33+- 保留存储器
34+ - 必需为上面的数据类型分配一个变量(数据字段),并预留存储器内存。
35+ - 必需为一个处理程序/句柄(handle)预留存储器内存, DLL文件中的处理程序/句柄(handle)稍后将分配。
36+- 分配DLL和外部的子例程并接受数据
37+ - 调用DLL文件,并将DLL文件中的处理程序/句柄(handle)分配到处理程序/句柄(handle)。
38+ - 变量的指针必需更改为external子程序的存储器内存。
39+ - external子程序的结果可以被接受。
40+- 释放所有的存储器
41+ - 变量的指针必须再次指向一个无效的存储器区域(:= nil)以释放外部的子程序。
42+ - DLL的存储器必须再次释放。
43+
44+在你自己的程序中,集成/融入、使用和释放DLL中的子程序:
45+
46+``` pascal
47+ uses
48+ Windows, ...;
49+
50+ ...
51+
52+ Include function funDll : string;
53+ type
54+ // 照着DLL(在源文件中)所使用的定义的方式,定义将要调用的子程序
55+ TfunStringBack = function(strIn : string) : PChar; stdcall;
56+
57+ var
58+ // 为DLL子程序创建一个合适的变量(数据字段)
59+ funStringBack : TfunStringBack;
60+ // 为DLL创建一个处理程序/句柄
61+ LibHandle : THandle;
62+
63+ begin
64+ // 获取将要使用的库的处理程序/句柄
65+ LibHandle := LoadLibrary(PChar('DLLTest.dll'));
66+
67+ // 检查是否成功加载DLL文件
68+ if LibHandle <> 0 then
69+ begin
70+ // 分配子程序调用的存储器地址给变量funStringBack
71+ // 'funStringBack'来自DLL DLLTest.dll
72+ Pointer(funStringBack) := GetProcAddress(LibHandle, 'funStringBack');
73+
74+ // 检查是否已经返回一个有限的存储器内存地址
75+ if @funStringBack <> nil then
76+ Result := funStringBack('hello world');
77+ end;
78+
79+ // 释放存储器内存
80+ funStringBack := nil;
81+ FreeLibrary(LibHandle);
82+
83+ end;
84+
85+ ...
86+```
87+
88+# 贡献者和更改
89+
90+- 简体中文版本由 robsean 于 2021-10-19 创建(2021-11-04完成全部翻译)。
91+
92+---
93+*From the Free Pascal wiki, page "DLL dynamically load/zh CN", as it stood on 2021-11-04 after a change by Robsean, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history