2013-10-18 79 views
0

我已閱讀this並瞭解lpC​​lass可用於解決「錯誤的文件擴展問題」。但是,當我閱讀以下代碼行時,我無法弄清楚在打開可執行文件時使用的lpClass。使用ShellExecuteEx打開一個可執行文件,同時指定一個lpClass?

//code excerpt from foo.exe 
SHELLEXECUTEINFO info; 
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO)); 
info.cbSize = sizeof(SHELLEXECUTEINFO); 
info.nShow = SW_NORMAL; 
info.lpVerb = L"open"; 
info.lpClass = L"ProgId Of foo.exe"; //what is this used for??? 
info.fMask = SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_CLASSNAME;  
info.lpFile = L"bar.exe"; 
info.lpParameters = lpszParam; 
ShellExecuteEx(&info); 

沒有lpClass被指定,如果lpVerb是「開放」和lpFile是一個exe,運行代碼只是執行EXE。但是如果在這種情況下指定lpClass呢?

回答

1

參數lpClass應該是文件類型的ProgID。那是什麼意思?

嗯考慮,如果你不及格的類會發生什麼。

  1. 在現實中,這意味着殼牌查找文件擴展名(例如.htm)在註冊表中,HKEY_CLASSES_ROOT\.htm下。然後它檢查默認值,通常是htmlfile。 (它也使用其他技巧,但在絕大多數情況下,它是決定progid的擴展)。

  2. 接下來它查找HKEY_CLASSES_ROOT\htmlfile,並使用那裏的信息(在HKEY_CLASSES_ROOT\htmlfile\shell\open下)來決定如何打開文件。

那麼你如何使用lpClass?那麼,例如,假設你有一個.TXT文件,但你知道它確實是html,你可以通過"htmlfile"作爲lpclass參數。這將跳過第1步(查看文件擴展名以查找類)並直接進入第2步。這將(通常)導致文件在瀏覽器中而不是記事本中打開。

在你的榜樣,你已經通過"bar.exe"lpFile參數。如果您通過"txtfile"作爲lpClass您應該發現它不是運行bar.exe它在記事本中打開它。

+0

ProgId不用於文件關聯。 Foo.exe註冊爲具有該ProgId的COM服務器,progid用於調用bar.exe作爲SHELLEXECUTEINFO中的lpClass成員...並且我對COM沒有經驗,對不起,我無法解釋ProgId與調用者** foo.exe **相關。 – kennyzx

+0

@kennyzx,這不是'ShellExecuteEx'的用途。你想'CLSIDFromProgID'和'CoCreateInstance'。如果註冊正確,COM系統將負責啓動「bar.exe」。 – Ben

相關問題