Delphi DLL 的编写
Delphi DLL 的编写 By Shaoyun 2010-03-18
最近打算继续学习Delphi,平常很少用,现在又有很长时间没动了!顺便将学习的内容写下来备忘!
例子代码:

1 library SYLib;
2 uses
3 SysUtils,Classes;
4 {$R *.res}
5 function Max(x:Integer; y: Integer):Integer;stdcall;
6 begin
7 if x>y then
8 Result:= x
9 else
10 Result:= y;
11 end;
12
13 exports
14 Max;
15
16 begin
17 end.
2 uses
3 SysUtils,Classes;
4 {$R *.res}
5 function Max(x:Integer; y: Integer):Integer;stdcall;
6 begin
7 if x>y then
8 Result:= x
9 else
10 Result:= y;
11 end;
12
13 exports
14 Max;
15
16 begin
17 end.
Dephi为fastcall调用方式,C/C++是stdcall调用,为了DLL能让这些程序调用,最好声明为stdcall类型,exports导出函数,不导出是没法调用的!
调用方法有静态和动态两种:
静态调用,也是最常用的一种方法
在var后声明
function Max(x:Integer;y:Integer):Integer;stdcall; external 'SYLib.dll'
调用和平常一样,如下:
procedure TForm1.btn1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Max(2,3)));
end;
begin
ShowMessage(IntToStr(Max(2,3)));
end;
动态调用,麻烦些:

1 procedure TForm2.btn1Click(Sender: TObject);
2 type
3 TFunType=function(x:Integer;y:Integer):Integer;stdcall;
4 var
5 dllHandle:THandle;
6 pfun:TFarProc;
7 _Max:TFunType;
8 begin
9 dllHandle:= LoadLibrary('SYLib.dll');
10 if dllHandle>0 then
11 try
12 pfun:=GetProcAddress(dllHandle,PAnsiChar('Max'));
13 if pfun<>nil then
14 begin
15 _Max:=TFunType(pfun);
16 ShowMessage(IntToStr(_Max(2,3)));
17 end
18 else
19 ShowMessage('没有找到Max函数!');
20 finally
21 FreeLibrary(dllHandle);
22 end
23 else
24 ShowMessage('没有找到SYLib.dll!');
25 end;
2 type
3 TFunType=function(x:Integer;y:Integer):Integer;stdcall;
4 var
5 dllHandle:THandle;
6 pfun:TFarProc;
7 _Max:TFunType;
8 begin
9 dllHandle:= LoadLibrary('SYLib.dll');
10 if dllHandle>0 then
11 try
12 pfun:=GetProcAddress(dllHandle,PAnsiChar('Max'));
13 if pfun<>nil then
14 begin
15 _Max:=TFunType(pfun);
16 ShowMessage(IntToStr(_Max(2,3)));
17 end
18 else
19 ShowMessage('没有找到Max函数!');
20 finally
21 FreeLibrary(dllHandle);
22 end
23 else
24 ShowMessage('没有找到SYLib.dll!');
25 end;
暂时就这些! Delphi2010 / Windows SP3 下测试!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端