ReactOS  0.4.15-dev-985-gd905dd5
shellservices.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2005 Martin Fuchs
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 
20  //
21  // Explorer clone
22  //
23  // shellservices.cpp
24  //
25  // Martin Fuchs, 28.03.2005
26  //
27 
28 
29 #include <precomp.h>
30 
31 #include "shellservices.h"
32 
33 
35 {
37 
38  HKEY hkey;
39  CLSID clsid;
41 
42  typedef vector<SIfacePtr<IOleCommandTarget>*> SSOVector;
43  SSOVector sso_ptrs;
44 
45  if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) {
46  for(int idx=0; ; ++idx) {
47  DWORD name_len = MAX_PATH;
48  DWORD value_len = sizeof(value);
49 
50  if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len))
51  break;
52 
53  if (!_alive)
54  break;
55 
57 
58  if (CLSIDFromString(value, &clsid) == NOERROR) {
59  if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) {
60  if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL)))
61  sso_ptrs.push_back(sso_ptr);
62  }
63  }
64  }
65 
66  RegCloseKey(hkey);
67  }
68 
69  if (!sso_ptrs.empty()) {
70  MSG msg;
71 
72  while(_alive) {
74  break; // _evtFinish has been set.
75 
76  while(_alive) {
77  if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
78  break;
79 
80  if (msg.message == WM_QUIT)
81  break;
82 
85  }
86  }
87 
88  // shutdown all running Shell Service Objects
89  for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) {
90  SIfacePtr<IOleCommandTarget>* sso_ptr = *it;
91  (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
92  delete sso_ptr;
93  }
94  }
95 
96  return 0;
97 }
#define DispatchMessage
Definition: winuser.h:5740
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define PeekMessage
Definition: winuser.h:5805
#define NOERROR
Definition: winerror.h:2354
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WM_QUIT
Definition: winuser.h:1605
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:53
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2853
smooth NULL
Definition: ftsmooth.c:416
#define WAIT_OBJECT_0
Definition: winbase.h:387
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
REFCLSID clsid
Definition: msctf.c:82
GLsizei const GLfloat * value
Definition: glext.h:6069
#define TEXT(s)
Definition: k32.h:26
#define QS_ALLINPUT
Definition: winuser.h:874
wrapper class for COM interface pointers
Definition: shellclasses.h:332
#define msg(x)
Definition: auth_time.c:54
Definition: name.c:38
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
#define PM_REMOVE
Definition: winuser.h:1182
#define INFINITE
Definition: serial.h:102
#define RegOpenKey
Definition: winreg.h:519
#define SUCCEEDED(hr)
Definition: intsafe.h:57
COM Initialisation.
Definition: shellclasses.h:178
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12