アトリエ ぺっぺ

トップページ > プログラムTips > ファイルの実行

◆ ファイルの実行
エクスプローラでファイルをダブルクリックした時の動作を再現するには、シェル関数を使い、以下のようにします。
// LPITEMIDLISTの取得
LPITEMIDLIST getItemIDList(const char* sFilePath)
{
    LPITEMIDLIST  pIdl;
    LPSHELLFOLDER pDesktopFolder; 

    // デスクトップフォルダの取得
    if(::SHGetDesktopFolder(&pDesktopFolder) != NOERROR)
        return NULL;

    OLECHAR       ochPath[MAX_PATH];
    ULONG         chEaten;             // 文字列のサイズの受け口
    ULONG         dwAttributes;        // 属性の受け口
    HRESULT       hr;

    // インターフェイスの用意
    ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sFilePath, -1, ochPath, MAX_PATH);
    // ITEMIDLISTの取得
    hr = pDesktopFolder->ParseDisplayName(NULL, NULL, ochPath, &chEaten, &pIdl, &dwAttributes);
    if(hr != NOERROR)
        pIdl = NULL;
    // デスクトップフォルダを解放
    pDesktopFolder->Release();

    return pIdl;
}

// 実行用関数 hWndにはメインウィンドウのハンドルを渡す
bool executeFile(const char* sFilePath, HWND hWnd)
{
    // LPITEMIDLISTを取得
    LPITEMIDLIST pIdl = getItemIDList(sFilePath);
    if(pIdl == NULL){
        return false;
    }
    // 実行時の情報を、SHELLEXECUTEINFO構造体に設定
    SHELLEXECUTEINFO    stExeInfo;
    stExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    stExeInfo.fMask = SEE_MASK_INVOKEIDLIST;
    stExeInfo.hwnd = hWnd;
    stExeInfo.lpVerb = NULL;
    stExeInfo.lpFile = NULL;
    stExeInfo.lpParameters = NULL;
    stExeInfo.lpDirectory = NULL;
    stExeInfo.nShow = SW_SHOWNORMAL;
    stExeInfo.hInstApp = NULL;
    stExeInfo.lpIDList = (LPVOID)pIdl;
    // 実行
    return ::ShellExecuteEx(&stExeInfo) == TRUE;
}

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp