2013-03-24 57 views
1

我正在使用WinAPI函數ShellExecuteEx()在Windows資源管理器中打開文件夾。如何在ShellExecuteEx中使用CoInitializeEx

根據MSDN我應該始終調用之前CoInitializeEx()使用ShellExecuteEx()但我應該用什麼標誌爲CoInitializeEx()第二個參數?

當然,還有實例,其中的ShellExecute不使用 這些類型的外殼擴展之一,這些實例不會要求 COM在所有被初始化。儘管如此,在使用此功能之前總是要初始化COM是 的良好慣例。

CoInitializeEx(NULL, What params should I use?); //COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE) 

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
ShExecInfo.fMask = NULL; 
ShExecInfo.hwnd = NULL; 
ShExecInfo.lpVerb = _T("explore"); 
ShExecInfo.lpFile = pszParseName; 
ShExecInfo.lpParameters = NULL; 
ShExecInfo.lpDirectory = NULL; 
ShExecInfo.nShow = SW_MAXIMIZE; 
ShExecInfo.hInstApp = NULL; 

ShellExecuteEx(&ShExecInfo); 
CoUninitialize(); 
+0

恩,請嘗試在您引用的文本之前立即讀取*。 @WhozCraig UI線程應該使用STA,而不是MTA。 – 2013-03-24 13:30:29

+0

@RaymondChen當然你是對的(我不希望別的事,作爲你的博客的讀者)。我完全失去了他所援引的這種背景形式。 MTA/RPC管理的STA評論是一個普遍性,但是你指出對我來說應該是顯而易見的東西是絕對正確的。我會放下評論。 – WhozCraig 2013-03-24 18:18:41

回答

1

CoInitializeEx()初始化COM-SCM的應用程序。您至少應該用COINIT_APARTMENTTHREADED來調用它,儘管到目前爲止您尚未使用代碼中的任何COM對象。這意味着調用線程將被放置在它自己的公寓中,並且調用COM對象需要被編組。
如果您看here,還可以撥打COINIT_MULTITHREADED。最好你應該使用這個選項,因爲它可能會加快性能。 COM是一個相當複雜的話題,尤其是關於公寓。

相關問題