MFC 功能区应用程序不显示功能区 - 将 .exe 复制粘贴到另一台计算机时

Posted

技术标签:

【中文标题】MFC 功能区应用程序不显示功能区 - 将 .exe 复制粘贴到另一台计算机时【英文标题】:MFC Ribbon app not displaying ribbon - when .exe is copy pasted to a different machine 【发布时间】:2012-05-11 20:07:49 【问题描述】:

嗯,我遇到了一个奇怪的问题。我在我的机器上开发了一个示例 MFC 功能区应用程序 - Windows 7 和 Visual Studio 2008。当我将 .exe 复制粘贴到我的笔记本电脑并运行应用程序时,我看不到功能区菜单(实际上应用程序没有菜单)。

我尝试使用进程监视器查找在每种情况下(在我的工作机器和笔记本电脑上)加载的 .dll,但我无法找到我可能丢失的内容。任何帮助将不胜感激。

编辑 1 -

好的,非常感谢您的回复。在这个问题上已经取得了一些进展

    我将 IDE 更改为 VS 2010。功能区是手动编码的,我想知道是否可以将其添加为资源,也许问题会得到解决。 VS 2008 没有添加功能区作为资源的选项。

    我安装了 VS 2010 Service Pack Redistributable X86/X64,具体取决于机器是 32 位还是 64 位。

    我从 VS 2010 构建了一个新的“ribbontest.exe”应用程序,并将其部署在我将测试我的实际应用程序的其他机器上。 “ribbontest.exe”的功能区加载没有任何问题。

当我部署并运行我的应用程序时,首先旧的菜单栏会加载一两秒,然后功能区会闪烁并消失。

我所指的应用程序的一点历史 - 最初我的应用程序有菜单栏视图。我按照这篇文章http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c14929/MFC-Feature-Pack-An-Introduction.htm 来容纳一条丝带。

有什么建议吗?

【问题讨论】:

您的笔记本电脑是否运行 Windows 7? 功能区控件的 xml 由 MFC dll 加载,我忘记了使用哪个 vc 08 执行此操作,如果没有该 dll,功能区将无法加载功能区和其他资源。跨度> Manifest 是应用程序资源中应用程序的一部分。 【参考方案1】:

设置“路径”中很可能存在冲突。在您的 InitInstance() 处理程序中,您有这样的声明:

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
SetRegistryKey(_T("yourappname"));

如果您尚未更改该名称,请执行此操作。如果您这样做了,请在您的目标计算机上打开 regedit.exe 并删除 HKCU\Software\yourappname 下的整个密钥,然后重试。

MFC 将用户自定义的 Ribbons/Menus/... 存储在该键下。但是,如果您更改了您的应用,这些设置不一定会再匹配,您最终可能会出现无法正确显示或根本无法显示的内容。

【讨论】:

这是不正确的。应用程序在第一次运行时创建此密钥并关闭,保存设置。此注册表项与永恒学习者问题无关。 它可以有:如果密钥没有从示例应用程序使用的默认值更改,并且他已经在该计算机上尝试了另一个示例应用程序。那么那里可能有错误的设置。【参考方案2】:

确保在目标计算机上下载并安装 Visual C++ Redistributable Runtime:http://www.microsoft.com/en-us/download/details.aspx?id=29

或者,类似的东西。确保您的架构 (x86/x64) 正确,并确保它与您编译时使用的服务包版本匹配。

【讨论】:

乔,如果机器上没有 c++ 可再发行组件,应用程序甚至无法在目标机器上打开 @johnathon 然而说完之后,你告诉他在上面的线程中寻找一个MFC DLL? VC++ 运行时安装程序安装 MFC。通常,MFC 应用程序不调用 LoadLibrary(),而是依赖于直接动态链接。如果他以这种方式丢失了一个 DLL,它会说丢失了哪个。他可能没有所需的正确版本的 DLL。 澄清一下:LoadLibrary 用于加载 DLL 并请求程序地址。它被称为显式动态链接(动态加载或运行时动态链接)。这允许在不与导入库链接的情况下使用库并且不需要头文件。当您使用导入库 (.lib) 链接模块时,不需要 LoadLibrary;库是自动加载的。这是隐式动态链接(静态加载或加载时动态链接)。【参考方案3】:

Joe 是对的:您需要可再分发。

Joe 是对的:你不能在 32 位机器上运行 64 位程序。

上述所有情况都会由系统指示(缺少 DLL、配置不正确或 64/32 位差异)

Joe 是对的:您的应用程序必须针对特定的一组最低 Windows 版本和服务包构建。

除了 Joe 的帖子之外,您还必须运行发布构建而不是调试构建。 如果满足所有这些要求但您仍然遇到此问题,请尝试静态链接 MFC 并查看问题是否仍然存在。

【讨论】:

以上是关于MFC 功能区应用程序不显示功能区 - 将 .exe 复制粘贴到另一台计算机时的主要内容,如果未能解决你的问题,请参考以下文章

功能区 MFC 中未显示快速访问工具栏 (QAT)

Mfc 功能包 CMFCOutlookBar 未显示

我想用MFC完成一个绘图功能

MFC程序怎样实现“复制”“粘贴”功能,我做了一个程序,在窗口客户区显示表格和文字,但不能复制粘贴

MFC 功能包 - 关闭后无法显示可停靠窗格

Qt 中是不是有与 MFC OnUpdate 等效的功能?