我看到了一个Delphi(对象Pascal)代码,该代码强制卸载软件中加载的任何模块(dll)。然后,在此代码的基础上,我现在需要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的调用的返回值的代码代替,这里的文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx

一旦DLL的每个进程引用计数变为零,该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));
}

关于c++ - 如何在C++(Dev C++编译器)中强制卸载库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34884509/

10-11 23:01
查看更多