3

最近、C++ で Windows API を使用してウィンドウ クラスを作成しようとしています。ただし、ShowWindow を呼び出そうとすると、関数は最後のエラーを 1400 (ERROR_INVALID_WINDOW_HANDLE) に設定します。しばらく試した後、次の例を見つけました: http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx#comments

新しいプロジェクトを作成し (私は MSVC Express 2008 を使用しています)、コードを正確にコピーしても (これは私はやりたくないことです)、コードがウィンドウを正常に作成しているにもかかわらず、ShowWindow 関数が依然としてエラー 1400 を報告することを発見しました。上記のリンクにあるコード:

int PASCAL
WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int nShowCmd)
{
 g_hinst = hinst;

 if (SUCCEEDED(CoInitialize(NULL))) {
  InitCommonControls();

  RootWindow *prw = RootWindow::Create();
  if (prw) {
   ShowWindow(prw->GetHWND(), nShowCmd);
   int error = GetLastError(); //Line added by me, error gets set to 1400.
   MSG msg;
       while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
  }
  CoUninitialize();
 }
 return 0;
}

(完全なコードは上記のリンクにあります)

ShowWindow でエラー 1400 を受け取ることなく、ウィンドウ ハンドルをクラスのメンバー変数として持つ方法について誰かがアイデアを持っている場合は、助けていただければ幸いです。

4

2 に答える 2

6
   ShowWindow(prw->GetHWND(), nShowCmd);
   int error = GetLastError();

これは正しいコードではありません。GetLastError() の呼び出しが有効なのは、winapi 関数が失敗したときだけです。失敗しなかったときに GetLastError() を使用すると、完全に乱数が得られます。ShowWindow() は、エラー コードをまったく生成しないという点で少し特殊なので、GetLastError() の使用は決して正しくありません。

一般的なパターンはおおよそ次のとおりです。

if (!SomeWinapiFunction(...)) {
    int error = GetLastError();
    CrashAndBurn(error);
}

ただし、MSDN のドキュメントをチェックして、エラーを示す戻り値と GetLastError() が適切かどうかを確認してください。たとえば、通常、GDI関数にはありません。コードの他の部分でもこれを修正してください。生の API を使用する場合、エラー処理を正しく行うことが非常に重要です。特に、RootWindow::Create() メソッドには、ウィンドウの作成に失敗したことを示す適切な方法がないことに注意してください。それを修正する必要があります。もちろん、例外はそうするための非常に良い方法です。

于 2013-03-02T00:18:06.870 に答える