アプリ版:「スタンプのみでお礼する」機能のリリースについて

   こんにちは。
自分は、今、RegisterClassExでWNDCLASSEX構造体を使い、ウィンドウの登録を行っているのですが
戻り値が0でないにも関わらず、その後のGetLastErrorで値が2になっています。
以下がソースコードです。
            DWORD last;
// ウィンドウクラス登録
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.style = 0;
wcx.lpfnWndProc = WndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = (HICON)::LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON,0,0,LR_DEFAULTSIZE);
wcx.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);
wcx.lpszClassName = WindowClassName;
wcx.lpszMenuName = NULL;
wcx.hIconSm = wcx.hIcon;
if(::RegisterClassEx(&wcx) == 0)
{
return FALSE;
}
last = GetLastError();// 値が2
どうしてエラーでないのに値が2になるのでしょうか?
値が2だと、指定したファイルが見つからないとでますがどうなんでしょうか?

A 回答 (2件)

Windows XP ( Windows 7 の XP モード ) で試してみました。


今まで、戻り値が正常終了を示す値の時はエラーコードなんて気にしてませんでしたから気がつきませんでしたが、確かに RegisterClassEx の後ではエラーコードが 2 になりました。
しかし、ウィンドウは問題なく生成されますし、Spy++ で見てみてもウィンドウクラス名が正しく登録されていましたので、問題はないのではないかと思います。エラーコードが 2 になるのが間違いで、RegisterClassEx の戻り値を信じればよいのではないかと思います。

ちなみに、Windows 7 ( 64 bit ) だと、RegisterClassEx の後ではエラーコードは 0 になりました。

この回答への補足

 検証ついでなんでしょうが、もうひとつお聞きしたいのがWNDCLASSEXをつかって設定をしてる最中にプログラムが強制終了するということは聞いたことがないでしょうか?
  RegisterClassExで登録する前の構造体に代入する部分で、アイコン読み込みとかで落ちるんです。 

補足日時:2011/07/16 01:02
    • good
    • 0
この回答へのお礼

  検証ありがとうございます。
Windows XP (32bit)版だと、エラー値2になるんですよね。
でも確かにこっちでも正常に動かせます。
値が2だと指定されたファイルが見つかりませんですし。
なんでRegisterClassつかって指定されたファイルが無いって言われるのか
さっぱり分かりませんでした。

  こういったエラーのせいなのか何故かRegisterClassExに行くまでにウィンドウの設定のところで落ちる?ような状況になってるPCがあったりなぞです。

お礼日時:2011/07/16 00:58

RegisterClassEx より前にどこかでエラーが出ているんじゃないでしょうか。



http://msdn.microsoft.com/ja-jp/library/cc428944 …

を見ると、「特定の関数は成功したときに SetLastError(0) を呼び出して、直前に失敗した関数が設定したエラーコードを消去してしまうからです。」と書かれていますから、全ての関数が成功したときにエラーコードをクリアしてしまうわけではないのでしょう。

RegisterClassEx を呼び出す前に

SetLastError(0);

を入れて試してみると良いかもしれないですね。

この回答への補足

指摘された通りに
wcx.hIconSm = wcx.hIcon;
SetLastError(0) // 0クリア
if(::RegisterClassEx(&wcx) == 0)
{
return FALSE;
}
last = GetLastError();// 値が2

SetLastErrorを挿入してみたんですが、変化はなく、やはりRegisterClassEX
でエラーが出ているようです。

補足日時:2011/07/15 22:50
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
指摘されて、修正してみたところエラー箇所が一箇所減りました。
しかし、RegisterClassExだけはやはりだめなようです。

お礼日時:2011/07/15 22:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!