我有一个编译好的 GUI 应用程序。我需要了解它是否使用 MFC 库进行编程。Depends.exe 不返回任何对 MFC42*.dll 的依赖关系。是否有任何工具可以获取有关可执行文件的其他信息?(如果可能的话,不仅是库,还有正在使用的编译器等。)
9 回答
另请注意,MFC 应用程序可能已静态链接到 MFC 库而不是使用共享库 - 静态链接的 MFC 应用程序不会将 MFCXXX.dll 的依赖关系显示为 Depends 中的直接依赖关系。
如果应用程序是使用MFC编写的,它通常由具有以Afx:字符串为前缀的类名的窗口组成。
如果您可以访问Spy++实用程序,则可以很容易地查询任何可执行文件的类名详细信息。
如果您关注的应用程序动态链接到 MFC,它将依赖于 MFCXX.dll,其中 XX 是版本号。例如,我们的应用程序依赖于 MFC80.dll。
但是,如果应用程序是静态链接的,则 MFC 的所有源代码都将直接编译到应用程序中。
dumpbin 是您想要的工具,如果它是静态链接的。MFC 符号往往被命名为“...Afx...”或“...MFC...”,因此如果您看到这些符号,则可能是在使用 MFC。该实用程序还可以告诉您链接器版本、为其编译的操作系统等。
您可以检查可执行文件中是否有任何标准 MFC 资源。
您可以尝试在文件上运行 dumpbin 实用程序(SDK 的一部分或 VS 安装)。
如果你运行“dumpbin /exports”,你可以寻找任何有说服力的 MFC-isms。我不确定是否会有,所以测试只会确认 MFC 是静态链接的,而不是反驳它。
如果你可以运行应用程序,让它运行,然后使用 Sysinternals 工具ProcessExplorer查看加载的 DLL。
或者您是否需要一种程序化方式来确定应用程序是否使用 MFC?另外,我有点惊讶 Depends 没有显示您的期望。将 Depends 输出与 ProcessExplorer 进行比较,看看您能学到什么。
Babak Farrokhi 曾经编写了一个非常方便的小程序,名为“Language 2000”,它可以扫描 exe 以查找库和框架的二进制签名。它用于检测静态链接的 MFC 程序的两个手指。不过,几年前我使用它时,该程序已经很旧了。您必须检查网络是否有更新的版本可用,或者签名是否仍然有效。谁知道!
SysInternals(最近被微软收购)发布取决于。无论它是动态链接到 DLL 还是静态链接,您都会看到引用的导入/导出符号(可能因 C++ 入口点签名而损坏)。
这个工具对于检测循环引用(使用依赖树)也非常有用。在极少数情况下,当您绝对确定您导出了入口点但链接器仍然失败时,您可以检查 DLL 中的“缺失”入口点。
还有助于发现 DLL 的隐藏秘密。