当.exe程序使用此.dll文件时,如何知道.dll文件中调用了哪些函数?

时间:2013-01-07 15:44:46

标签: c++ dll dllimport

我有一个与调用dll文件中的函数有关的问题。如果我理解的话,在dll文件中我们可以定义许多可以由.exe文件调用的不同函数。例如,可以从a.dll文件调用的函数包括以下函数:

void fun1(int k);
int  fun2(float value);
float fun3(double sig);

对于特定程序,例如a.exe,它可能仅在fun1中调用a.dll函数而不使用其他函数。然后我的问题是,我怎么知道在运行.exe程序时调用了哪些函数。

2 个答案:

答案 0 :(得分:4)

您可以检查可执行文件的符号表以获取导入的符号。对于Windows(.exe文件),您可以使用DUMPBIN utility with /IMPORTS as described here

更新:如评论中所述,可执行文件可以加载DLL并以不在编译时创建符号的方式动态访问它们。例如,在使用GetProcAddress加载DLL后调用LoadLibrary。在这种情况下,将不会出现符号,DUMPBIN将不会列出它,但可以调用或不调用函数。

如果你或多或少知道exe的工作原理并且它似乎没有动态地进行操作(例如从插件DLL中加载代码)那么假设没有动态加载可能是安全的。此外,如果exe的符号表显示来自给定DLL的某些函数,则exe不太可能从同一DLL动态访问函数。

此外,函数出现在符号表中的事实并不保证它将被exe调用,但在任何正常的静态情况下它很可能使它成为可能。

答案 1 :(得分:1)

您可以使用Dependency Walker

“Dependency Walker是一个免费的实用工具,可扫描任何32位或64位Windows模块(exe,dll,ocx,sys等),并构建所有相关模块的分层树形图。对于找到的每个模块,它列出了该模块导出的所有函数,以及其他模块实际调用了哪些函数。另一个视图显示了所需文件的最小集合,以及每个文件的详细信息,包括文件的完整路径,基地址,版本号,机器类型,调试信息等。“