我想计算流程的数量,因为每个流程都使用LoadLibary。 我正在考虑将注册程序作为一种选择。
这个想法是当一个进程使用库时,库可以创建一个单独的进程 当最后一个进程注销时,如果需要关闭进程,该进程将被关闭。
有没有人使用* DLL完成此操作,他们是如何实现的?请
答案 0 :(得分:2)
创建DLL以在内存和可执行文件中工作。
如果你是shure,你需要单独的过程阅读:
http://msdn.microsoft.com/en-us/library/ms682583(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms682594(v=vs.85).aspx
http://delphi.about.com/cs/adptips2003/a/bltip1003_2.htm
重要提示:http://delphi.about.com/od/objectpascalide/l/aa103003a.htm
答案 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世界中,库模型更有效。