ついに判明、XP と 2000 のコモンコントロールの動作の違い

JavaScript Memory Leak Detector (v2)がWindows 2000で動かないという話を聞いて、色々試してみた結果、XP と 2000で 決定的に違う関数の動作を発見しました


実行したのは次のコード

    InitCommonControls();
    f=GetClassInfoExA(hInstance,"SysHeader32",&cl);
                  :
    n=GetClassInfoExA(hInstance,"SysLink",&cl);

ctest2
XPでは、すべてのコントロールが使えるのが分かります.

ctest
一方、Windows 2000では、Comctl32.dll 4.7以降のクラスが使えない?!

INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(iccx);
iccx.dwICC = ICC_STANDARD_CLASSES;
InitCommonControlsEx(&iccx);

ちなみに、これは全てのコントロール使えるようにする命令なのですが、InitCommonControls() と同じ動作になります

Windows 2000で同じ動作にするためには

INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(iccx);
iccx.dwICC =ICC_NATIVEFNTCTL_CLASS|ICC_PAGESCROLLER_CLASS
|ICC_INTERNET_CLASSES|ICC_USEREX_CLASSES|ICC_DATE_CLASSES
|ICC_COOL_CLASSES|ICC_STANDARD_CLASSES;
InitCommonControlsEx(&iccx);

こうしなきゃいけないようだ

ちなみに、ICC_LINK_CLASSがあると低レベルのコントロール以外は全て無効になり、ICC_STANDARD_CLASSESはXP以降のはずだけど、指定しても無視されるようだ

ちなみに、Windows 2000にXPのcomctl32.dll 5.82 を入れると正常に動くのだった(SP4 SRP2v18には入ってるよ)

5.81の仕様なんだろうかね

おすすめ

3件のフィードバック

  1. CZ500C より:

    SRP2 V18 あるんですか?
    V17までしか見あたらないんですけど?

  2. blackwingcat より:

    あ、すみません自分だけ開発版のv18使ってたの忘れてました|・ω・)

  3. Egtra より:

    http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507(v=vs.85).aspx
    Windows 2000のほうが仕様通りの挙動と言うべきのように思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です