如何确定应用程序是否为MFC程序



我有一个已编译的GUI应用程序。我需要了解它是否使用MFC库进行编程。Depends.exe不返回对MFC42*.dll的任何依赖项。是否有任何工具可以获取有关可执行文件的其他信息?(如果可能的话,不仅是库,还有正在使用的编译器等。)

如果应用程序是使用MFC编写的,它通常由具有类名的窗口组成,这些类名前缀为Afx:字符串。

如果您可以访问Spy++实用程序,则可以很容易地查询任何可执行文件的类名详细信息。

还要注意,MFC应用程序可能已静态链接到MFC库,而不是使用共享库-静态链接的MFC应用程序不会将对MFCXXX.dll的依赖显示为Depends中的直接依赖。

如果您关心的应用程序动态链接到MFC,它将依赖于MFCXX.dll,其中XX是版本号。例如,我们的应用程序依赖于MFC80.dll。

但是,如果应用程序是静态链接的,则MFC的所有源代码都将直接编译到应用程序中。

dumpbin是您想要的工具,如果它是静态链接的。MFC符号往往命名为"…"。。。Afx…'或'。。。MFC…',所以如果你看到这些,它可能使用MFC。该实用程序还可以告诉您链接器的版本、编译的操作系统等。

您可以尝试在文件上运行dumpbin实用程序(SDK或VS安装的一部分)。

如果你运行"dumpbin/exports",你可以寻找任何能说明问题的MFC主义。我不确定是否会有,所以测试只会确认MFC是静态链接的,而不是反驳它。

如果您可以运行应用程序,请运行它,然后使用Sysinternals工具ProcessExplorer查看加载的DLL。

或者你需要一种程序化的方式来确定应用程序是否使用MFC?此外,我有点惊讶Depends没有展示出你所期望的。将Depends输出与ProcessExplorer进行比较,看看您能学到什么。

Babak Farrokhi曾经写过一个非常方便的小程序,名为"Language 2000",它可以扫描exes,寻找库和框架的二进制签名。它用来检测静态链接的MFC程序两个手指上的鼻子。不过,当我几年前使用这个程序时,它已经很旧了。你必须检查网站是否有更新的版本,或者签名是否仍然有效。谁知道呢!

SysInternals(最近由Microsoft购买)发布取决于。无论是动态链接到DLL还是静态链接,您都会看到引用的导入/导出符号(对于C++入口点签名可能会被破坏)。

该工具对于检测循环引用(使用依赖树)也非常有益。在极少数情况下,当你绝对确定你导出了入口点,但链接器仍然失败时,你可以检查DLL中"丢失"的入口点。

还有助于发现DLL的隐藏秘密。

最新更新