如何判断应用程序是不是为 MFC 程序?

Posted

技术标签:

【中文标题】如何判断应用程序是不是为 MFC 程序?【英文标题】:How to determine if the application is an MFC program?如何判断应用程序是否为 MFC 程序? 【发布时间】:2008-10-08 14:35:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我已经在问题中说过,它不会返回任何依赖项。而且我认为可以静态构建 MFC 应用程序。 如果 MFC 静态链接到应用程序则不会。【参考方案3】:

dumpbin 是您想要的工具,如果它是静态链接的。 MFC 符号往往被命名为“...Afx...”或“...MFC...”,因此如果您看到这些符号,则可能是在使用 MFC。该实用程序还可以告诉您链接器版本、为其编译的操作系统等。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

如果你运行“dumpbin /exports”,你可以寻找任何有说服力的 MFC-isms。我不确定是否会有,所以测试只会确认 MFC 是静态链接的,而不是反驳它。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

您可以检查是否有任何Standard MFC Resources 在可执行文件中。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

以上是关于如何判断应用程序是不是为 MFC 程序?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 如何在主线程中判断子线程是不是运行,运行则关闭子线程?

vc6.0中的mfc程序,判断当前exe程序所在的文件夹内,是不是有data这个文件夹

C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC

我如何知道一个项目是不是是 MFC 应用程序

我如何知道我的 MFC 应用程序是不是使用 COM / OLE?

将基于桌面的 MFC C++ 应用程序转换为 Web 应用程序是不是可行