动态载入DLL

unit MainForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TDLLDemo = function(x, y: Integer): Integer; stdcall;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
DllHandle: THandle;
DllPointer: Pointer;
MyDLLFunc: TDLLDemo;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
DllHandle := LoadLibrary(‘DLLDemo.dll‘);
if DllHandle > 0 then
try
DllPointer := GetProcAddress(DllHandle, PChar(‘AddIt‘));
if DllPointer <> nil then begin
MyDLLFunc := TDLLDemo(DllPointer);
Edit1.Text := IntToStr(MyDLLFunc(5, 3));
end
else
ShowMessage(‘没有找到AddIt‘);
DllPointer := GetProcAddress(DllHandle, PChar(‘SubIt‘));
if DllPointer <> nil then begin
MyDLLFunc := TDLLDemo(DllPointer); //此处还可用如下形式
//1. @MyDLLFunc := GetProcAddress(DllHandle, PChar(‘SubIt‘));
//2. @MyDLLFunc := DllPointer;
// 家@操作符的目的是--前加上取址运算符@,这样就不会在编译时出现类型转换错误。
Edit2.Text := IntToStr(MyDLLFunc(5, 3));
end
else
ShowMessage(‘没有找到SubIts‘);
finally
FreeLibrary(DllHandle);
end
else
ShowMessage(‘没有找到DLLDemo.dll‘);
end;

end.

{

三个Win32 API函数:LoadLibrary()、FreeLibrary()、GetProcAddress()。
LoadLibrary()声明如下:

function LoadLibrary(lpLibFileName: Pchar): HMODULE; stdcall;

上述函数调入由 lpLibFileName 参数指定的 DLL 模块,并将其映射到调用进程的地址空间。如果调
用成功,函数将返回该模块的句柄;若失败,返回值为0,并触发一异常。你可以查阅在线帮助中
LoadLibrary()函数的详细说明以及可能返回的错误值。

FreeLibrary()声明如下:

function FreeLibrary(hLibModule: HMODULE): BOOLEAN; stdcall;

FreeLibrary()函数减小 hLibModule 指定的库的实例计数。当该 DLL 的实例计数是零时,调用的 DLL
就会被释放。实例计数记录使用这个 DLL 的任务数。
GetProcAddress()是这样定义的:

function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;
GetProcAddress() 返回的是一个函数在模块中的地址,其中由 hModule 参数指定模块。hModule 是
从 LoadLibrary() 函数返回的结果THandle。如果 GetProcAddress() 调用失败,则返回 nil。你只有调
用 GetLastError() 才能获得详细的错误信息。

}

时间: 2024-10-24 00:13:00

动态载入DLL的相关文章

动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

x动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址.当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载. 动态调用使用的 Windows API 函数主要有 3 个, 分别是 LoadLibrary.

C#程序实现动态调用DLL的研究(转)

摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛

C#程序实现动态调用DLL的研究[转]

摘   要: 在< csdn 开发高手> 2004 年第 03 期中的<化功大法——将 DLL 嵌入 EXE >一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“ DLL Hell ”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用 C++ 实现了,在 Internet 上也有相似的 VB 程序,但在某一技术论坛上提起这种设计方法时

动态载入Layout 与 论Activity、 Window、View的关系

1)动态载入Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); 它等同于 setContentView(R.layout.main); 事实上 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))  是 setContentView(R.layout

关于LightMapping和NavMesh烘焙的动态载入

熟悉unity的朋友都应该知道,unity有内部LightMapping烘焙和NavMesh寻路的功能.但这些非常好用的功能,都是基于对某个已经保存的关卡(scene)进行烘焙(Bake)的操作,我一直以为,一般来说这样非常难做到外部载入或者动态载入的. 但通过近期一段时间的研究,发现事实上这些基于scene的功能,也是能够动态载入的,尽管在使用上是有一定的限制,只是合理利用还是能做到不少想要的效果的. 如果我们限制有这种项目要求,游戏项目是网页游戏,因为容量的关系,我们全部的场景都是外部动态载

Silverlight动态载入调用XAML资源

以多语言为例子: ResourceDictionary resourceDictionary = new ResourceDictionary(); //新建资源集合 var culture = CultureInfo.CurrentCulture;//获取本地Culture if (culture.Name != "zh-CN") { Application.LoadComponent(resourceDictionary, new Uri("/ETiger_MarketT

动态载入TreeView时让TreeView节点前显示加号

解释下标题,我这里通过webservice获取数据并动态载入TreeView节点.那么某个节点展开前它是没有子节点的.那么它就不显示加号.这样会让用户误以为此节点不能展开.我是这样做的,每次创建节点a时,默觉得它创建一个子节点b(随便给个名字即可,如果为"呵呵"),那么创建的节点a就有了子节点b,也就会显示加号了,等展开节点a时,再把刚才默认创建的子节点b移除就能够了,删除方法是先推断展开的节点a是否有一个子节点而且名字为"呵呵".如果为真则删掉. 当然这样做导致有

DL动态载入框架技术文档

DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管理 3. APK动态载入框架DL解析 4. Android 使用动态载入框架DL进行插件化开发 5. DL插件开发笔记 6. DL开发注意事项 附:DL层次结构图