如何知道从哪个DLL加载的方法

时间:2013-08-22 06:42:51

标签: c++ windows winapi dll

常见的方法foo()在两个DLL A.dll和B.dll中定义。现在当进程proc.exe加载两个DLL并同时从两个线程调用foo()方法时。有没有办法知道foo()是在运行时从哪个DLL A.dll或B.dll加载的。我需要这些信息用于记录目的。我在互联网上找不到任何相关内容。

GetModuleFileName()将返回进程名proc.exe而不是Dlls名称。

3 个答案:

答案 0 :(得分:3)

假设您拥有该函数的地址,您应该能够使用以下内容来确定模块的基址。

HMODULE ModuleFromAddress(void *address)
{
  MEMORY_BASIC_INFORMATION mbi;
  if (VirtualQuery(address, &mbi, sizeof(mbi)) != 0)
    return (HMODULE)mbi.AllocationBase;
  return NULL;
}

然后将结果输入GetModuleFileName

答案 1 :(得分:1)

调用堆栈(至少在MS Visual Studio中)不能说明这一点吗? (抱歉由于声誉限制不能写评论)

答案 2 :(得分:1)

您可以找到foo所在的地址以及每个dll加载的地址范围。 Foo必须位于2个地址范围之一。要找出加载dll的位置,请检查Finding the memory address of a loaded DLL in a process in C++。链接中提到的MODULEINFO结构提供了起始地址&大小。