C++ 如何确定函数调用使用的是哪个Windows DLL?
我一直在研究C++ 如何确定函数调用使用的是哪个Windows DLL?,c++,windows,dll,msvcrt,ntdll,C++,Windows,Dll,Msvcrt,Ntdll,我一直在研究\u vsnprintf,了解到它在ntdll.dll和msvcrt.dll中可用 我可以使用GetModuleHandle和GetProcAddress访问\u vsnprintf,例如: static int(__cdecl *p__vsnprintf)(char *str, size_t count, const char *format, va_list valist); static void init(const char *dll) { HMODULE hmo
\u vsnprintf
,了解到它在ntdll.dll和msvcrt.dll中可用
我可以使用GetModuleHandle
和GetProcAddress
访问\u vsnprintf
,例如:
static int(__cdecl *p__vsnprintf)(char *str, size_t count, const char *format, va_list valist);
static void init(const char *dll)
{
HMODULE hmod = GetModuleHandleA(dll);
if (hmod)
{
printf("*** Testing %s ***\n", dll);
p__vsnprintf = (void *)GetProcAddress(hmod, "_vsnprintf");
if (p__vsnprintf) test__vsnprintf();
else printf("_vsnprintf not found in %s.\n", dll);
}
else printf("*** Unable to load %s ***\n", dll);
printf("\n");
}
int main(void)
{
init("ntdll.dll"); /* ntdll _vsnprintf */
init("msvcrt.dll"); /* msvcrt _vsnprintf */
printf("*** Testing normal function call ***\n");
test_vsnprintf(); /* _vsnprintf in ??? */
return 0;
}
对于泛型调用,我如何判断Windows是否正在使用ntdll.dll或msvcrt.dll中的
\u vsnprintf
?dumpbin/imports
将告诉您。此外,方便。要实用,您有两个主要选项:
GetProcAddress
),则可以使用和从中查找模块。还有一个用于查找模块名称的方法GetProcAddress
时,只需跟踪所使用的HMODULE
感谢您指出
dumpbin
程序。输出显示仅从msvcrt.dll调用\u vsnprintf
。我必须在VS2010中使用它。VS2013是否提供此功能?如果您的意思是VS2013是否提供dumpbin
,答案是肯定的dumpbin
只是一个调用link/dump
的小包装程序。谢谢您的回答。我将查看您列出的WinAPI函数。关于第3点,这是对我使用的代码示例的建议吗?我不知道你跟踪HMODULE
@HughMcMaster是什么意思:是的,这是对示例代码的一个建议。基本上,您还有一个附加的全局变量和函数指针,它保存用于(成功)获取函数指针的模块的模块名或句柄。