C++ 从VS 2k3到VS 2k8-MFC应用程序在版本配置中未正确呈现

C++ 从VS 2k3到VS 2k8-MFC应用程序在版本配置中未正确呈现,c++,visual-studio-2008,mfc,C++,Visual Studio 2008,Mfc,编辑问题已解决,请参见下文 不久前,我们不得不将一个MFC应用程序从VisualStudio2003迁移到2008。除了一个巨大的缺陷外,它在大多数情况下运行正常:发布版本没有正确显示我们的对话框,而调试版本运行良好 下面是它应该是什么样子的示例(以及它在调试中的样子): (图上的黑色方块是故意的) 以下是发布版本的外观: 现在,为了解决这个问题,我经历了不同的步骤: 我用发布配置中的/MDd构建了运行库,并用VS(我知道是脏的)运行了它;它是有效的(好吧,我在关闭时出错,这是可以预料的

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


不久前,我们不得不将一个MFC应用程序从VisualStudio2003迁移到2008。除了一个巨大的缺陷外,它在大多数情况下运行正常:发布版本没有正确显示我们的对话框,而调试版本运行良好

下面是它应该是什么样子的示例(以及它在调试中的样子):

(图上的黑色方块是故意的) 以下是发布版本的外观:

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

  • 我用发布配置中的/MDd构建了运行库,并用VS(我知道是脏的)运行了它;它是有效的(好吧,我在关闭时出错,这是可以预料的),但它显然远远不是理想的
  • 我在Debug和Release可执行文件上运行了Dependency Walker,并对它们进行了比较:除了Debug DLL(MSVC[PR]90D和MFC90D),它们基本上是一样的。我在那里没有发现任何有意义的东西
  • 我试图按照MSDN MSDN.microsoft.com/en us/library/fsk896zz(v=vs.90).aspx中描述的步骤调试我的发布版本,这表现出一种特殊的行为:在vs中调试exe时,对话框被正确呈现。但是,使用相同的.exe文件并从VS启动时,会再次显示错误的对话框
起初我以为是某个DLL不在这里,或者版本不正确(哦,我们也从x86系统升级到x64系统,这可能是相关的;尽管应用程序仍然是以32位开发的),但自从发布调试以来,我不太确定,因为它没有使用调试DLL(在process explorer中验证)

<>我在这里感到茫然,而且还没有真正的C++悟性,所以任何帮助都将非常感谢: 编辑两个对话框实际上包含相同的组件,发布版本中的对话框显示为“折叠”,主要位于左上角,好像它不知道将组件放置在何处

编辑确定,问题已解决:

好吧,那太傻了

问题出现在以下代码位中:

CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame;
CRect rect;
pFrame->Create(NULL, formatString(IDR_TITRE), WS_CAPTION | MFS_SYNCACTIVE, rect, 0);
(“CminInframe”继承自CMiniFrameWnd)

“CRect rect;”在VS2003中是正常的,甚至在VS2008的调试构建中似乎也是正常的,尽管回顾过去,我认为它一直是错误的,因为它没有初始化对象(如这里所说:msdn.microsoft.com/fr/library/9y3502k0(v=VS.90).aspx)。因此,出于某种原因,这在发布版本中不起作用

我不得不这样编辑它:

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);
框架的尺寸稍后会重新处理,因此我为其指定的值并不重要,但似乎我必须指定它们

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

感谢Michael为我指出了正确的方向,我想要的是一个更牵强的解决方案。

的文档清楚地说明,您必须提供一个包含所需窗口大小和位置的矩形,或者您必须提供默认矩形(rectDefault),让窗口选择大小和位置

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

const AFX_DATADEF CRect CFrameWnd::rectDefault( CW_USEDEFAULT, CW_USEDEFAULT, 0, 0);
CW_USEDEFAULT在WinUser.h中的定义如下:

#define CW_USEDEFAULT       ((int)0x80000000)

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

它看起来好像是一个不同的对话框。在第二个“你”,“曼努埃尔”,但在第一个,你有“IpimeNo.D.Feffut”。你试过“全部重建”吗?实际上是同一个对话框,在第二个屏幕截图中,所有内容都简单地“折叠”;第二个显示的勾选框只是第一个黑框中的一个(我忘了在第二个中放一个黑框,这可能会让人困惑,这是我的错误)。当没有合理的信息时,不要放黑框。通过在OnInitDialog函数的不同位置调用GetWindowRect,尝试找出对话框何时崩溃。对于如此巨大的布局差异,没有简单的解释。没有人能从截图上调试你的代码。@MichaelWalz:是的,我承认我对这些框做得有点过火,对不起。我将尝试记录各种GetWindowRect,看看它是如何运行的。汉斯:我知道描述有点含糊不清,但我正在寻找任何缩小解决方案范围的方法。我会更新我得到的信息。谢谢你的详细解释。我得到的是,调试中未初始化的值与发行版中的值不同(正如您所说,VS2K3也是如此)。很高兴这件事结束了。