エクスプローラでファイルをダブルクリックした時の動作を再現するには、シェル関数を使い、以下のようにします。
// 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;
}
|