potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C++&ATL IShellDisp2::GetSystemInformationのATLサンプルコード

C++でATLを使用してShellインスタンスのIShellDisp2::GetSystemInformationメソッドを操作するサンプルコードです。エラー処理などは簡略化しています。

// IShellDisp2::GetSystemInformationのATLサンプルコード

#define STRICT
#include <Windows.h>
#include <TChar.h>
#include <ShlDisp.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlcomcli.h>

using namespace::ATL;

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    // COMの初期化
    HRESULT hr = ::CoInitializeEx(
        nullptr,
        COINIT::COINIT_MULTITHREADED);
    if (FAILED(hr))
    {
        return -1;
    }

    // CoInitializeEx/Uninitializeよりも先に解放されるスコープを定めます。
    { 
        // Shellインスタンスの作成
        CComPtr<IShellDispatch2> pShellDisp;
        HRESULT hr = ::CoCreateInstance(
            CLSID_Shell,
            nullptr,
            CLSCTX_INPROC_SERVER,
            IID_IShellDispatch2,
            (LPVOID*)&pShellDisp);
        if (SUCCEEDED(hr))
        {
            // TODO: ここにShellインスタンスが作成できた場合の処理を追加します。 
            //
            CComVariant vDirectoryServiceAvailable;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"DirectoryServiceAvailable"), &vDirectoryServiceAvailable);

            CComVariant vDoubleClickTime;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"DoubleClickTime"), &vDoubleClickTime);

            CComVariant vProcessorLevel;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"ProcessorLevel"), &vProcessorLevel);

            CComVariant vProcessorSpeed;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"ProcessorSpeed"), &vProcessorSpeed);

            CComVariant vProcessorArchitecture;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"ProcessorArchitecture"), &vProcessorArchitecture);

            CComVariant vPhysicalMemoryInstalled;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"PhysicalMemoryInstalled"), &vPhysicalMemoryInstalled);

            CComVariant vIsOS_DomainMember;
            hr = pShellDisp->GetSystemInformation(
                CComBSTR(L"IsOS_DomainMember"), &vIsOS_DomainMember);
        }
    }

    // COMの解放
    ::CoUninitialize();

    return 0;
}