WIn32API ファイルに関連付けられている実行ファイル名を取得する

ファイルに関連付けられている実行ファイル名を取得するためには、Shell APIのFindExecutable関数を用いる

HINSTANCE FindExecutable(
  LPCTSTR lpFile,       // ファイル名文字列へのポインタ
  LPCTSTR lpDirectory,  // 既定ディレクトリ文字列へのポインタ
  LPTSTR lpResult       // 返される実行可能ファイル文字列を
                        // 保持するバッファへのポインタ
);



  • Pythonインストールディレクトリ以下の各種ファイルに関連付けられている実行ファイル名を取得するサンプルプログラム
  • #include <windows.h>
    #include <stdio.h>
    
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")
    
    
    int main()
    {
        TCHAR szBuf[MAX_PATH];
        
        if ((int)FindExecutable(TEXT("zipfile.py"), TEXT("C:\\Python27\\Lib"), szBuf) > 32) {
            _tprintf(TEXT("zipfile.py: %s\n"), szBuf);
        } else {
            _tprintf(TEXT("FindExecutable(1) failed"));
        }
    
        if ((int)FindExecutable(TEXT("README.txt"), TEXT("C:\\Python27"), szBuf) > 32) {
            _tprintf(TEXT("README.txt: %s\n"), szBuf);
        } else {
            _tprintf(TEXT("FindExecutable(2) failed"));
        }
    
        if ((int)FindExecutable(TEXT("pyconfig.h"), TEXT("C:\\Python27\\include"), szBuf) > 32) {
            _tprintf(TEXT("pyconfig.h: %s\n"), szBuf);
        } else {
            _tprintf(TEXT("FindExecutable(3) failed"));
        }
    
        if ((int)FindExecutable(TEXT("python.exe"), TEXT("C:\\Python27"), szBuf) > 32) {
            _tprintf(TEXT("python.exe: %s\n"), szBuf);
        } else {
            _tprintf(TEXT("FindExecutable(4) failed"));
        }
    
        if ((int)FindExecutable(TEXT("python27.dll"), TEXT("C:\\Python27"), szBuf) > 32) {
            _tprintf(TEXT("python27.dll: %s\n"), szBuf);
        } else {
            _tprintf(TEXT("FindExecutable(5) failed"));
        }
    
        return 0;
    }



  • 実行結果
  • zipfile.py: C:\Python27\python.exe
    README.txt: C:\Windows\system32\NOTEPAD.EXE
    pyconfig.h: c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\VCEx
    press.exe
    python.exe: C:\Python27\python.exe
    FindExecutable(5) failed




    参考
    http://msdn.microsoft.com/ja-jp/library/cc422052.aspx