常见的方法foo()在两个DLL A.dll和B.dll中定义。现在当进程proc.exe加载两个DLL并同时从两个线程调用foo()方法时。有没有办法知道foo()是在运行时从哪个DLL A.dll或B.dll加载的。我需要这些信息用于记录目的。我在互联网上找不到任何相关内容。
GetModuleFileName()将返回进程名proc.exe而不是Dlls名称。
答案 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结构提供了起始地址&大小。