从VS 2k3到VS 2k8 - MFC应用程序无法在Release配置中正确呈现

时间:2013-08-07 08:59:35

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

编辑问题已解决,请参阅下文


我们不得不将MFC应用程序从Visual Studio 2003迁移到2008年。大部分都没问题,除了一个巨大的缺陷:发布版本没有正确显示我们的对话框,而调试版本工作正常。

以下是它应该是什么样子的示例(以及它在调试中的样子): http://img11.hostingpics.net/pics/864144InterfaceOK1OUT.png

(故意将黑色方块放在图片上) 这是发布版本的样子: http://img11.hostingpics.net/pics/813251InterfaceKO1OUT.png

现在,为了解决这个问题,我经历了不同的步骤:

  • 我在Release配置中使用 / MDd 构建了运行时库,并将其从VS中运行(脏,我知道);它很有效(好吧,我在收盘时会收到错误,这可能是预期的),但显然远非理想。
  • 我在Debug和Release可执行文件上运行了Dependency Walker并对它们进行了比较:除了调试DLL(MSVC [PR] 90D和MFC90D)之外,它们大致相同。我没有找到任何有意义的东西。
  • 我尝试按照MSDN msdn.microsoft.com/en-us/library/fsk896zz(v=vs.90).aspx中描述的步骤调试我的发布版本,这表现出一种奇特的行为:在调试exe时在VS中,对话框已正确呈现。但是,使用相同的.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 rect;”在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);

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

完成后,应用程序正常运行并且显示正常。

感谢迈克尔指出我正确的方向,我想要一个更加遥远的解决方案。

1 个答案:

答案 0 :(得分:0)

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

此默认矩形在MFC中定义如下:

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

CW_USEDEFAULT在WinUser.h中定义如下:

#define CW_USEDEFAULT       ((int)0x80000000)

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