0

编辑问题已解决,见下文


不久前,我们不得不将 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);

框架的尺寸稍后会重新设计,因此我分配给它的值并不重要,但似乎我必须分配它们。

完成此操作后,应用程序可以正常工作并且看起来很好。

感谢迈克尔为我指明了正确的方向,我正在寻求一个更牵强的解决方案。

4

1 回答 1

0

CFrameWnd::Create的文档明确指出,您必须提供一个包含所需窗口大小和位置的矩形,或者您必须提供允许 Windows 选择大小和位置的默认矩形 (rectDefault)。

这个默认矩形在 MFC 中是这样定义的:

const AFX_DATADEF CRect CFrameWnd::rectDefault( CW_USEDEFAULT, CW_USEDEFAULT, 0, 0);

CW_USEDEFAULT 在 WinUser.h 中定义如下:

#define CW_USEDEFAULT       ((int)0x80000000)

现在我想你可能很幸运,你的应用程序可能会失败,这取决于矩形的未初始化值,即使使用 VS2K3。

于 2013-08-09T09:16:56.173 回答