クリスマスということで

今年は、こんなケーキです。
限定 10 個だったりしたので、些細な喜びがありました。

そういえば、先日、3年ぶりに携帯を機種変更(SH902iS → N-01B)しました。
いじっていると結構楽しい。でも、電池のもちがいまいちかなぁ。

C++ で WMI クラスを使う

WMI は、普段、スクリプトで使うことがほとんどだと思いますが、C++ で使ってみようということで
コーディング方法を紹介します。VB でもなく、.NET でもなく、あえて C++ です…。
COM プログラミングなので、後処理(Release() を呼ぶのが面倒)を楽にするために、ATL のスマートポインタを使います。

今回の例は、WMI の Win32_OperatingSystem クラスを使って、コンピューター種別を調べてみようというシナリオです。
具体的には、Win32_OperatingSystem クラスの ProductType メンバーの値を参照して調べるというものです。
(一部、エラー処理を省いています)

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    HRESULT hRes;

    hRes = CoInitializeSecurity(NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_PKT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        0);
    if (SUCCEEDED(hRes))
    {
        CComPtr<IWbemLocator> pIWbemLocator = NULL;
        CComPtr<IWbemServices> pWbemServices = NULL;

        hRes = pIWbemLocator.CoCreateInstance(CLSID_WbemAdministrativeLocator,
            NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER);
        if (SUCCEEDED(hRes))
        {
            CComBSTR bstrNamespace = (L"root\\cimv2");
            hRes = pIWbemLocator->ConnectServer(
                        bstrNamespace,
                        NULL,
                        NULL,
                        NULL,
                        0,
                        NULL,
                        NULL,
                        &pWbemServices);

            CComBSTR strQuery = L"Select * from Win32_OperatingSystem";
            CComBSTR strQL = L"WQL";
            CComPtr<IEnumWbemClassObject> pEnumObject = NULL;

            hRes = pWbemServices->ExecQuery(strQL, strQuery, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumObject);

            ULONG uCount = 1, uReturned;
            CComPtr<IWbemClassObject> pClassObject = NULL;

            hRes = pEnumObject->Reset();
            hRes = pEnumObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned);

            CComVariant var;
            CComBSTR strClassProp = L"ProductType";
            hRes = pClassObject->Get(strClassProp, 0, &var, 0, 0);
            switch (var.intVal)
            {
            case 1: printf("This Computer is Workstation.\n"); break;
            case 2: printf("This Computer is Domain Controller.\n"); break;
            case 3: printf("This Computer is Server.\n"); break;
            default: printf("This Computer is UnKnown Type.\n"); break;
            }
        }
    }

    CoUninitialize();
    return 0;
}

C++ で WMI クラスを使う機会は少ないと思いますが、こんな方法で使うことができます。
他の WMI クラスも上記を参考にすれば、使えると思います。
こういうのを知ると、スクリプトって便利だなって思いますね。

ちなみにですが、WMI 開発の際に使えそうな便利ツールが Microsoft から提供されています。

  1. WMI Code Creator
    スクリプトで WMI を使ってみようなんて思ったら、ぜひ、これを使ってみてください。
    スクリプトコードのサンプルを出力してくれますし、C# や VB.NET のコードも生成できちゃったりします。
  2. WMI Administrative Tools
    この中にある WMI CIM Studio が有益なツールです。WMI の名前空間やクラス構造を調べるのに使うと便利です。

なお、これらのツールは、Windows Vista/Windows 7 でも動きます。

Windows 7 のマルチなタッチでエクスペリエンス(第 2 回)

Microsoft の Tech Filders に連載させて頂いてるコラムですが、第 2 回目が公開されました。

Windows 7 のマルチなタッチでエクスペリエンス

プログラミングについて記述していますので、よろしければ、ご覧ください。
前編ということは、後編もあります。お楽しみに。

いつもお世話になっている MS エバンジェリストの松崎さんにも紹介していただいちゃいました。
ありがとうございます。

[Info] Tech Fielders コラム/インタビュー 注目記事

本職が忙しくて、少し間が空いてしまいましたが、また、ペースを取り戻していきたいと思います。

動的ポートについて

以前の記事でも書いたのですが、Windows Vista 以降で、TCP/IP で使用する動的ポートの範囲が変更されています。

動的ポートは、ephemeral ports(エフェメラル ポート)という言い方もします。
これは、特定の用途で規定しておらず、一時的な通信のために、自由に使えるポートのことです。
HTTP や LDAP のようにポート番号が規定されているポートは、well-known port と呼びます。

  • Windows Vista よりも前の OS : 1024 ~ 5000
  • Windows Vista 以降の OS : 49152 ~ 65535

IANA に従うと、Vista 以降が正しい使用方法になっています。
1024 ~ 49151 のポート番号は、予約制になっており、IANA に登録が必要になります。

   ポートの種別  ポート番号の範囲
 1  well-known port  0 ~ 1023
 2  registered port  1024 ~ 49151
 3  ephemeral port  49152 ~ 65535

 

なお、IANA で割り当てられているポート番号の一覧は、以下に記載されています。

ポート番号は正しく使いましょう。