如何强制卸载 C++ 中的库(Dev C++ 编译器)?
How force unload library in C++ (Dev C++ compiler)?
我看到一个 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;
函数
HMODULE GetModuleHandle(LPCTSTR modulename)
BOOL FreeLibrary(HMODULE)
是 Windows API 的函数。它可以从支持针对 Windows API 编程的任何语言调用,如 C++
唯一建议:删除上面示例中的循环(重复直到不是...)。它应该被解释调用 FreeLibrary 的 return 值的代码替换,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx
一旦其per-process引用计数变为零,DLL将从内存中卸载(即执行进程的地址space);如果另一个进程仍然持有引用,则不能通过重复执行 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));
}
我看到一个 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;
函数
HMODULE GetModuleHandle(LPCTSTR modulename)
BOOL FreeLibrary(HMODULE)
是 Windows API 的函数。它可以从支持针对 Windows API 编程的任何语言调用,如 C++
唯一建议:删除上面示例中的循环(重复直到不是...)。它应该被解释调用 FreeLibrary 的 return 值的代码替换,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx
一旦其per-process引用计数变为零,DLL将从内存中卸载(即执行进程的地址space);如果另一个进程仍然持有引用,则不能通过重复执行 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));
}