如何在ShellExecuteEx中使用CoInitializeEx

时间:2013-03-24 07:59:36

标签: c++ winapi com

我正在使用WinAPI函数ShellExecuteEx()在Windows资源管理器中打开一个文件夹。

根据MSDN,我应该在使用CoInitializeEx()之前致电ShellExecuteEx(),但我应该使用哪些标志作为CoInitializeEx()的第二个参数?

  

有些情况下ShellExecute不使用其中一个   这些类型的Shell扩展和那些实例不需要   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();

1 个答案:

答案 0 :(得分:1)

CoInitializeEx()为您的应用程序初始化COM-SCM。您至少应该使用COINIT_APARTMENTTHREADED调用它,尽管到目前为止您还没有使用代码中的任何COM对象。这意味着,调用线程将被放入自己的公寓,并且需要对COM对象的调用进行编组。
如果您查看here,还可以选择致电COINIT_MULTITHREADED。您最好使用此选项,因为它可能会加快性能。 COM是一个非常复杂的话题,特别是关于公寓。