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