在Delphi中使用DLL注册

时间:2011-06-10 00:58:56

标签: delphi dllregistration

我想计算流程的数量,因为每个流程都使用LoadLibary。 我正在考虑将注册程序作为一种选择。

这个想法是当一个进程使用库时,库可以创建一个单独的进程 当最后一个进程注销时,如果需要关闭进程,该进程将被关闭。

有没有人使用* DLL完成此操作,他们是如何实现的?请

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

LoadLibrary() API调用已经在使用它的所有进程中共享库。

否则,任何调用大量标准库(Windows32.dll gdi32.dll ....)的Windows程序将使用比所需更多的内存。

如果事实,任何LoadLibrary() API调用都将从当前进程访问.dll文件导出(即库函数)。它只会在PS内存中“加载”一次(第一次使用它),然后它将链接库到进程,即它将从其名称中设置所有需要的函数。 / p>

例如,如果你写我们的程序:

  FHandle := LoadLibrary('library.dll') ;
  FInitialize := GetProcAddress(FHandle, 'Initialize') ;

每次都不会将磁盘库从磁盘加载到RAM。只有第一次加载。

Windows只搜索库中名为“Initialize”的导出函数,然后将其现有副本映射到当前进程地址空间,然后设置指针以在需要时正确调用外部Initialize函数。

所以我真的不明白你的问题:你不需要“计算”库使用实例,因为 Windows已经为你做了,比你应该实现它更好。当没有进程使用特定库时,它只是从内存中取消映射(好吧,我承认这不是真正发生的事情,它更复杂,但结果是一样的。)

在Windows下进行链接是快速而有效的:例如.exe格式可以更快地链接用于Linux的elf格式,例如:

在所有情况下,由于库需要链接到进程,因此您别无选择,只能调用LoadLibrary,因为这是库在进程内存空间中可用的唯一方法。您可以想到使用管道等进行远程执行......但是在Windows世界中,库模型更有效。