potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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;
}