编辑问题已解决,见下文
不久前,我们不得不将 MFC 应用程序从 Visual Studio 2003 迁移到 2008。大部分情况下都还可以,除了一个巨大的缺陷:发布版本没有正确显示我们的对话框,而调试版本工作得很好。
这是它应该是什么样子的示例(以及它在调试中的样子):http: //img11.hostingpics.net/pics/864144InterfaceOK1OUT.png
(黑色方块是故意在图片上的)这是发布版本的样子:http: //img11.hostingpics.net/pics/813251InterfaceKO1OUT.png
现在,为了解决这个问题,我经历了不同的步骤:
- 我在发布配置中使用/MDd构建了运行时库,并将其从 VS 中运行出来(我知道很脏);它有效(好吧,我在关闭时遇到错误,这是可以预料的),但显然远非理想。
- 我在 Debug 和 Release 可执行文件上运行了 Dependency Walker 并将它们进行了比较:除了 Debug DLL(MSVC[PR]90D 和 MFC90D)之外,它几乎是相同的。我在那里没有发现任何有意义的东西。
- 我尝试按照 MSDN msdn.microsoft.com/en-us/library/fsk896zz(v=vs.90).aspx 中描述的步骤调试我的 Release 版本,这呈现出一种特殊的行为:在 VS 中调试 exe 时,对话框正确呈现。但是,使用相同的 .exe 文件并从 VS 中启动会再次显示错误的对话框。
起初我以为是某个 DLL 不存在或版本错误(哦,这可能与我们也从 x86 系统转到 x64 系统有关;尽管该应用程序仍以 32 位开发),但是由于发布调试,我不太确定,因为它不使用调试 DLL(在进程资源管理器中验证它)。
我在这里不知所措,而且不是真正的c ++精通,所以任何帮助都将不胜感激:)
编辑这两个对话框实际上包含相同的组件,Release 版本中的一个出现“折叠”,主要位于左上角,好像它不知道将组件放在哪里。
编辑好的,问题解决了:
好吧,那太傻了……
问题出在以下代码中:
CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame;
CRect rect;
pFrame->Create(NULL, formatString(IDR_TITRE), WS_CAPTION | MFS_SYNCACTIVE, rect, 0);
(“CMainFrame”继承自 CMiniFrameWnd)
“CRect 矩形;” 在 VS2003 中没问题,甚至在 VS 2008 中的 Debug 版本中似乎也没问题,尽管回想起来我认为它一直都是错误的,因为它没有初始化对象(如此处所述:msdn.microsoft.com/fr-fr /library/9y3502k0(v=vs.90).aspx)。所以由于某种原因,这在 Release 版本中不起作用。
我不得不像这样编辑它:
CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame;
CRect rect(0,0,0,0);
pFrame->Create(NULL, formatString(IDR_TITRE), WS_CAPTION | MFS_SYNCACTIVE, rect, 0);
框架的尺寸稍后会重新设计,因此我分配给它的值并不重要,但似乎我必须分配它们。
完成此操作后,应用程序可以正常工作并且看起来很好。
感谢迈克尔为我指明了正确的方向,我正在寻求一个更牵强的解决方案。