0

編集問題は解決しました。以下を参照してください


少し前に、MFC アプリケーションを Visual Studio 2003 から 2008 に移行する必要がありました。リリース ビルドではダイアログが正しく表示されませんが、デバッグ ビルドでは問題なく動作します。

これがどのように見えるかのサンプルです (およびデバッグでどのように見えるか): http://img11.hostingpics.net/pics/864144InterfaceOK1OUT.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 に記載されている手順に従ってリリース ビルドをデバッグしようとしましたが、VS で exe をデバッグしているときに、奇妙な動作が発生しました。ダイアログが正しくレンダリングされました。ただし、同じ .exe ファイルを取得して VS から起動すると、間違ったダイアログが再び表示されました。

最初は、ここにないか間違ったバージョンの DLL だと思っていました (ああ、私たちも x86 から x64 システムに移行したことを言及することはおそらく関連があります。ただし、アプリケーションはまだ 32 ビットで開発されています)。リリースのデバッグ以来、デバッグDLLを使用していないため、よくわかりません(プロセスエクスプローラーで確認しました)。

私はここで途方に暮れており、さらにC ++に精通していないので、どんな助けでも大歓迎です:)

編集どちらのダイアログにも実際には同じコンポーネントが含まれています。Release ビルドのダイアログは、コンポーネントを配置する場所がわからないかのように、ほとんどが左上隅に「折りたたまれて」表示されます。

編集OK、問題は解決しました:

わかりました、それはかなりばかげていました...

問題は次のコードにありました。

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ではOKで、VS 2008のデバッグビルドでもOKのように見えますが、振り返ってみると、オブジェクトを初期化しないため、ずっと間違っていたと思います(ここで述べたように:msdn.microsoft.com/fr-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);

フレームの寸法は後で作り直されるので、どの値を割り当てるかは問題ではありませんが、割り当てる必要があるようです。

これが完了すると、アプリケーションが動作し、正常に表示されます。

私を正しい方向に向けてくれたマイケルに感謝します。

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 に答える