解説
AssocQueryStringを利用した実行ファイル取得する。
ほかにもFindExecutableを利用した方法が考えられる。しかしFindExecutableの場合は
調べたい拡張子のファイルを事前にtmpフォルダなどに作成しておく必要があり処理が面倒。
#include "shlwapi.h"
#include "atlstr.h"
#pragma comment(lib,"shlwapi.lib")
//
// 拡張子に関連付けられた実行ファイル取得
//
// pszExtensionは".txt"のようにする("txt"でも構わない)
// ".bat"を取得すると"%1"になるなど実際のコマンドとならないことがある!
//
bool GetExecutable(LPCTSTR pszExtension,CAtlString& strCommand)
{
DWORD dwOut;
HRESULT hr;
TCHAR pszFile[MAX_PATH+10];
CAtlString strExt;
strCommand = _T("");
if(pszExtension == NULL)
return false;
strExt = pszExtension;
if(strExt.Left(1) != _T("."))
strExt = _T(".") + strExt;
if(strExt.GetLength() == 1)
return false;
dwOut = MAX_PATH + 10;
hr = ::AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,strExt,_T("open"),pszFile,&dwOut);
if(FAILED(hr) || dwOut == 0)
return false;
strCommand = pszFile;
return true;
}
