我看到一个Delphi(Object Pascal)代码强制卸载我的软件中加载的任何模块(dll)。然后在这段代码中使用base,我现在需要和C ++(Dev C ++)中需要类似的东西。
有人可以帮我吗?
以下是我看到的Delphi代码:
procedure ForceRemove(const ModuleName: string);
var
hMod: HMODULE;
begin
hMod := GetModuleHandle(PChar(ModuleName));
if hMod=0 then
exit;
repeat
until not FreeLibrary(hMod);
end;
答案 0 :(得分:2)
功能
HMODULE GetModuleHandle(LPCTSTR modulename)
BOOL FreeLibrary(HMODULE)
是Windows API的功能。它可以从任何支持Windows API编程的语言调用,如C ++
仅建议:在上面的示例中删除循环(重复直到不...)。它应该被解释为FreeLibrary调用的返回值的代码替换,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx
只要每个进程引用计数为零,DLL就会从内存中卸载(也就是说,执行进程的地址空间);如果另一个进程仍然拥有引用,则无法通过重复执行FreeLibrary()强制全局卸载DLL。
编辑:包括将OP样本直接翻译成C ++片段:
void ForceRemove(LPCTSTR ModuleName)
{
HMODULE hMod;
hMod = ::GetModuleHandle(ModuleName);
if(hMod==0)
return;
/* DISCLAIMER potentially infinite loop
* not advisable in production code,
* included by request of the OP to
* match his original */
while(::FreeLibrary(hMod));
}