Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 34 of file shellservices.cpp.
{ ComInit usingCOM(COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE|COINIT_SPEED_OVER_MEMORY); HKEY hkey; CLSID clsid; WCHAR name[MAX_PATH], value[MAX_PATH]; typedef vector<SIfacePtr<IOleCommandTarget>*> SSOVector; SSOVector sso_ptrs; if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) { for(int idx=0; ; ++idx) { DWORD name_len = MAX_PATH; DWORD value_len = sizeof(value); if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len)) break; if (!_alive) break; SIfacePtr<IOleCommandTarget>* sso_ptr = new SIfacePtr<IOleCommandTarget>; if (CLSIDFromString(value, &clsid) == NOERROR) { if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) { if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL))) sso_ptrs.push_back(sso_ptr); } } } RegCloseKey(hkey); } if (!sso_ptrs.empty()) { MSG msg; while(_alive) { if (MsgWaitForMultipleObjects(1, &_evtFinish, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+0) break; // _evtFinish has been set. while(_alive) { if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) break; if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } } // shutdown all running Shell Service Objects for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) { SIfacePtr<IOleCommandTarget>* sso_ptr = *it; (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL); delete sso_ptr; } } return 0; }