2012年11月12日 星期一

FindExecutable 對於尋找 file associated program 並不可靠

windows 系統會記住許多文件的預設處理程式 例如 txt 檔案預設就是用 notepad 開啟
如果要在程式中找出某個文件的預設處理程式 有一個很直觀的 API FindExecutable 可以用

但是這個 API 並不太可靠 一個 known issue 是在 XP 上對於附檔名 accdb 的文件就找不到處理程式
網路上的討論是這個 API 對於 3 個字元以上副檔名的檔案處理可能會發生問題

在我的 XP 系統上 不只 accdb 出問題 rmvb 檔案也出問題找不到預設處理程式
網路上有人用 procmon 監控發現這個 FindExecutable 在查詢 registry 時會把副檔名弄錯
我試了一下果然如此

當用 rmvb 為副檔名時 FindExecutable 用 rmv 去查 registry
當用 accdb 為副檔名時 FindExecutable 用 acc 去查 registry
不過為什麼會有這種 bug 就不知道了

一個替代方案是用 AssocQueryString API
TCHAR exe_path_buf[MAX_PATH] = {0};DWORD buf_size = MAX_PATH;AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".accdb", "open", exe_path_buf, &buf_size);
經測試 rmvb 跟 accdb 都可以正常工作

沒有留言:

張貼留言