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

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

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

编辑 1 -

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

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

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

  3. 我从 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 是应用程序资源中应用程序的一部分。

标签: c++ visual-studio-2008 mfc ribbon


【解决方案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 并查看问题是否仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多