ReactOS 0.4.15-dev-7931-gfd331f1
CChangeNotifyServer Class Reference
Inheritance diagram for CChangeNotifyServer:
Collaboration diagram for CChangeNotifyServer:

Public Member Functions

 CChangeNotifyServer ()
 
virtual ~CChangeNotifyServer ()
 
HRESULT Initialize ()
 
STDMETHOD() GetWindow (HWND *lphwnd) override
 
STDMETHOD() ContextSensitiveHelp (BOOL fEnterMode) override
 
LRESULT OnRegister (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnUnRegister (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnDeliverNotification (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnSuspendResume (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnRemoveByPID (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
LRESULT OnDestroy (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 
 MESSAGE_HANDLER (CN_UNREGISTER_PROCESS, OnRemoveByPID)
 
 MESSAGE_HANDLER (WM_DESTROY, OnDestroy)
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT GetWindow ([out] HWND *phwnd)
 
HRESULT ContextSensitiveHelp ([in] BOOL fEnterMode)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Private Member Functions

BOOL AddItem (CWatchItem *pItem)
 
BOOL RemoveItemsByRegID (UINT nRegID)
 
BOOL RemoveItemsByProcess (DWORD dwUserPID)
 
void DestroyItem (CWatchItem *pItem, HWND *phwndBroker)
 
void DestroyAllItems ()
 
UINT GetNextRegID ()
 
BOOL DeliverNotification (HANDLE hTicket, DWORD dwOwnerPID)
 
BOOL ShouldNotify (LPDELITICKET pTicket, LPREGENTRY pRegEntry)
 

Private Attributes

UINT m_nNextRegID
 
CSimpleArray< CWatchItem * > m_items
 

Additional Inherited Members

- Public Types inherited from IOleWindow
typedef IOleWindowLPOLEWINDOW
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 34 of file CChangeNotifyServer.cpp.

Constructor & Destructor Documentation

◆ CChangeNotifyServer()

CChangeNotifyServer::CChangeNotifyServer ( )

Definition at line 89 of file CChangeNotifyServer.cpp.

91{
92}
#define INVALID_REG_ID

◆ ~CChangeNotifyServer()

CChangeNotifyServer::~CChangeNotifyServer ( )
virtual

Definition at line 94 of file CChangeNotifyServer.cpp.

95{
96}

Member Function Documentation

◆ AddItem()

BOOL CChangeNotifyServer::AddItem ( CWatchItem pItem)
private

Definition at line 98 of file CChangeNotifyServer.cpp.

99{
100 // find the empty room
101 for (INT i = 0; i < m_items.GetSize(); ++i)
102 {
103 if (m_items[i] == NULL)
104 {
105 // found the room, populate it
106 m_items[i] = pItem;
107 return TRUE;
108 }
109 }
110
111 // no empty room found
112 m_items.Add(pItem);
113 return TRUE;
114}
CSimpleArray< CWatchItem * > m_items
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int32_t INT
Definition: typedefs.h:58

◆ ContextSensitiveHelp()

HRESULT WINAPI CChangeNotifyServer::ContextSensitiveHelp ( BOOL  fEnterMode)
override

Implements IOleWindow.

Definition at line 461 of file CChangeNotifyServer.cpp.

462{
463 return E_NOTIMPL;
464}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DeliverNotification()

BOOL CChangeNotifyServer::DeliverNotification ( HANDLE  hTicket,
DWORD  dwOwnerPID 
)
private

Definition at line 353 of file CChangeNotifyServer.cpp.

354{
355 TRACE("DeliverNotification(%p, %p, 0x%lx)\n", m_hWnd, hTicket, dwOwnerPID);
356
357 // lock the delivery ticket
358 LPDELITICKET pTicket = (LPDELITICKET)SHLockSharedEx(hTicket, dwOwnerPID, FALSE);
359 if (pTicket == NULL || pTicket->dwMagic != DELITICKET_MAGIC)
360 {
361 ERR("pTicket is invalid\n");
362 SHUnlockShared(pTicket);
363 return FALSE;
364 }
365
366 // for all items
367 for (INT i = 0; i < m_items.GetSize(); ++i)
368 {
369 if (m_items[i] == NULL)
370 continue;
371
372 LPREGENTRY pRegEntry = m_items[i]->pRegEntry;
373 if (pRegEntry == NULL || pRegEntry->dwMagic != REGENTRY_MAGIC)
374 {
375 ERR("pRegEntry is invalid\n");
376 continue;
377 }
378
379 // should we notify for it?
380 BOOL bNotify = ShouldNotify(pTicket, pRegEntry);
381 if (bNotify)
382 {
383 // do notify
384 TRACE("Notifying: %p, 0x%x, %p, %lu\n",
385 pRegEntry->hwnd, pRegEntry->uMsg, hTicket, dwOwnerPID);
386 SendMessageW(pRegEntry->hwnd, pRegEntry->uMsg, (WPARAM)hTicket, dwOwnerPID);
387 TRACE("GetLastError(): %ld\n", ::GetLastError());
388 }
389 }
390
391 // unlock the ticket
392 SHUnlockShared(pTicket);
393
394 return TRUE;
395}
struct DELITICKET * LPDELITICKET
#define REGENTRY_MAGIC
#define DELITICKET_MAGIC
#define ERR(fmt,...)
Definition: debug.h:110
BOOL ShouldNotify(LPDELITICKET pTicket, LPREGENTRY pRegEntry)
#define FALSE
Definition: types.h:117
BOOL WINAPI SHUnlockShared(LPVOID lpView)
Definition: ordinal.c:291
unsigned int BOOL
Definition: ntddk_ex.h:94
PVOID WINAPI SHLockSharedEx(HANDLE hData, DWORD dwProcessId, BOOL bWriteAccess)
#define TRACE(s)
Definition: solgame.cpp:4
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
UINT_PTR WPARAM
Definition: windef.h:207
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by OnDeliverNotification().

◆ DestroyAllItems()

void CChangeNotifyServer::DestroyAllItems ( )
private

Definition at line 140 of file CChangeNotifyServer.cpp.

141{
142 for (INT i = 0; i < m_items.GetSize(); ++i)
143 {
144 if (m_items[i])
145 {
146 HWND hwndBroker = NULL;
147 DestroyItem(m_items[i], &hwndBroker);
148 m_items[i] = NULL;
149 }
150 }
151 m_items.RemoveAll();
152}
void DestroyItem(CWatchItem *pItem, HWND *phwndBroker)

Referenced by OnDestroy().

◆ DestroyItem()

void CChangeNotifyServer::DestroyItem ( CWatchItem pItem,
HWND phwndBroker 
)
private

Definition at line 116 of file CChangeNotifyServer.cpp.

117{
118 assert(pItem);
119
120 // destroy broker if any and if first time
121 HWND hwndBroker = pItem->hwndBroker;
122 pItem->hwndBroker = NULL;
123 if (hwndBroker && hwndBroker != *phwndBroker)
124 {
125 ::DestroyWindow(hwndBroker);
126 *phwndBroker = hwndBroker;
127 }
128
129 // request termination of pDirWatch if any
130 CDirectoryWatcher *pDirWatch = pItem->pDirWatch;
131 pItem->pDirWatch = NULL;
132 if (pDirWatch)
133 pDirWatch->RequestTermination();
134
135 // free
136 SHFree(pItem->pRegEntry);
137 delete pItem;
138}
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
#define assert(x)
Definition: debug.h:53
CDirectoryWatcher * pDirWatch
LPREGENTRY pRegEntry
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by DestroyAllItems(), RemoveItemsByProcess(), and RemoveItemsByRegID().

◆ GetNextRegID()

UINT CChangeNotifyServer::GetNextRegID ( )
private

Definition at line 343 of file CChangeNotifyServer.cpp.

344{
345 m_nNextRegID++;
347 m_nNextRegID++;
348 return m_nNextRegID;
349}

Referenced by OnRegister().

◆ GetWindow()

HRESULT WINAPI CChangeNotifyServer::GetWindow ( HWND lphwnd)
override

Implements IOleWindow.

Definition at line 453 of file CChangeNotifyServer.cpp.

454{
455 if (!phwnd)
456 return E_INVALIDARG;
457 *phwnd = m_hWnd;
458 return S_OK;
459}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define S_OK
Definition: intsafe.h:52

◆ Initialize()

HRESULT CChangeNotifyServer::Initialize ( )

Definition at line 466 of file CChangeNotifyServer.cpp.

467{
468 // This is called by CChangeNotifyServer_CreateInstance right after instantiation.
470 if (!hwnd)
471 return E_FAIL;
473 return S_OK;
474}
HWND SHCreateDefaultWorkerWindow(VOID)
#define E_FAIL
Definition: ddrawi.h:102
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542

◆ MESSAGE_HANDLER() [1/2]

CChangeNotifyServer::MESSAGE_HANDLER ( CN_UNREGISTER_PROCESS  ,
OnRemoveByPID   
)

◆ MESSAGE_HANDLER() [2/2]

CChangeNotifyServer::MESSAGE_HANDLER ( WM_DESTROY  ,
OnDestroy   
)

◆ OnDeliverNotification()

LRESULT CChangeNotifyServer::OnDeliverNotification ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 299 of file CChangeNotifyServer.cpp.

300{
301 TRACE("OnDeliverNotification(%p, %u, %p, %p)\n", m_hWnd, uMsg, wParam, lParam);
302
303 HANDLE hTicket = (HANDLE)wParam;
304 DWORD dwOwnerPID = (DWORD)lParam;
305
306 // do delivery
307 BOOL ret = DeliverNotification(hTicket, dwOwnerPID);
308
309 // free the ticket
310 SHFreeShared(hTicket, dwOwnerPID);
311 return ret;
312}
BOOL DeliverNotification(HANDLE hTicket, DWORD dwOwnerPID)
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId)
Definition: ordinal.c:311
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DWORD
Definition: nt_native.h:44
PVOID HANDLE
Definition: typedefs.h:73
int ret

◆ OnDestroy()

LRESULT CChangeNotifyServer::OnDestroy ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 335 of file CChangeNotifyServer.cpp.

◆ OnRegister()

LRESULT CChangeNotifyServer::OnRegister ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 213 of file CChangeNotifyServer.cpp.

214{
215 TRACE("OnRegister(%p, %u, %p, %p)\n", m_hWnd, uMsg, wParam, lParam);
216
217 // lock the registration entry
218 HANDLE hRegEntry = (HANDLE)wParam;
219 DWORD dwOwnerPID = (DWORD)lParam;
220 LPREGENTRY pRegEntry = (LPREGENTRY)SHLockSharedEx(hRegEntry, dwOwnerPID, TRUE);
221 if (pRegEntry == NULL || pRegEntry->dwMagic != REGENTRY_MAGIC)
222 {
223 ERR("pRegEntry is invalid\n");
224 SHUnlockShared(pRegEntry);
225 return FALSE;
226 }
227
228 // update registration ID if necessary
229 if (pRegEntry->nRegID == INVALID_REG_ID)
230 pRegEntry->nRegID = GetNextRegID();
231
232 TRACE("pRegEntry->nRegID: %u\n", pRegEntry->nRegID);
233
234 // get the user PID; that is the process ID of the target window
235 DWORD dwUserPID;
236 GetWindowThreadProcessId(pRegEntry->hwnd, &dwUserPID);
237
238 // get broker if any
239 HWND hwndBroker = pRegEntry->hwndBroker;
240
241 // clone the registration entry
242 LPREGENTRY pNewEntry = (LPREGENTRY)SHAlloc(pRegEntry->cbSize);
243 if (pNewEntry == NULL)
244 {
245 ERR("Out of memory\n");
246 pRegEntry->nRegID = INVALID_REG_ID;
247 SHUnlockShared(pRegEntry);
248 return FALSE;
249 }
250 CopyMemory(pNewEntry, pRegEntry, pRegEntry->cbSize);
251
252 // create a directory watch if necessary
253 CDirectoryWatcher *pDirWatch = NULL;
254 if (pRegEntry->ibPidl && (pRegEntry->fSources & SHCNRF_InterruptLevel))
255 {
256 pDirWatch = CreateDirectoryWatcherFromRegEntry(pRegEntry);
257 if (pDirWatch && !pDirWatch->RequestAddWatcher())
258 {
259 ERR("RequestAddWatcher failed: %u\n", pRegEntry->nRegID);
260 pRegEntry->nRegID = INVALID_REG_ID;
261 SHUnlockShared(pRegEntry);
262 delete pDirWatch;
263 return FALSE;
264 }
265 }
266
267 // unlock the registry entry
268 SHUnlockShared(pRegEntry);
269
270 // add an item
271 CWatchItem *pItem = new CWatchItem { m_nNextRegID, dwUserPID, pNewEntry, hwndBroker, pDirWatch };
272 return AddItem(pItem);
273}
static CDirectoryWatcher * CreateDirectoryWatcherFromRegEntry(LPREGENTRY pRegEntry)
struct REGENTRY * LPREGENTRY
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
#define SHCNRF_InterruptLevel
Definition: shlobj.h:1920
#define AddItem
Definition: userenv.h:209
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define CopyMemory
Definition: winbase.h:1710

◆ OnRemoveByPID()

LRESULT CChangeNotifyServer::OnRemoveByPID ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 328 of file CChangeNotifyServer.cpp.

329{
330 DWORD dwUserPID = (DWORD)wParam;
331 RemoveItemsByProcess(dwUserPID);
332 return 0;
333}
BOOL RemoveItemsByProcess(DWORD dwUserPID)

◆ OnSuspendResume()

LRESULT CChangeNotifyServer::OnSuspendResume ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 316 of file CChangeNotifyServer.cpp.

317{
318 TRACE("OnSuspendResume\n");
319
320 // FIXME
321 return FALSE;
322}

◆ OnUnRegister()

LRESULT CChangeNotifyServer::OnUnRegister ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)

Definition at line 279 of file CChangeNotifyServer.cpp.

280{
281 TRACE("OnUnRegister(%p, %u, %p, %p)\n", m_hWnd, uMsg, wParam, lParam);
282
283 // validate registration ID
284 UINT nRegID = (UINT)wParam;
285 if (nRegID == INVALID_REG_ID)
286 {
287 ERR("INVALID_REG_ID\n");
288 return FALSE;
289 }
290
291 // remove it
292 return RemoveItemsByRegID(nRegID);
293}
BOOL RemoveItemsByRegID(UINT nRegID)
unsigned int UINT
Definition: ndis.h:50

◆ RemoveItemsByProcess()

BOOL CChangeNotifyServer::RemoveItemsByProcess ( DWORD  dwUserPID)
private

Definition at line 171 of file CChangeNotifyServer.cpp.

172{
173 BOOL bFound = FALSE;
174 HWND hwndBroker = NULL;
175 assert(dwUserPID != 0);
176 for (INT i = 0; i < m_items.GetSize(); ++i)
177 {
178 if (m_items[i] && m_items[i]->dwUserPID == dwUserPID)
179 {
180 bFound = TRUE;
181 DestroyItem(m_items[i], &hwndBroker);
182 m_items[i] = NULL;
183 }
184 }
185 return bFound;
186}

Referenced by OnRemoveByPID().

◆ RemoveItemsByRegID()

BOOL CChangeNotifyServer::RemoveItemsByRegID ( UINT  nRegID)
private

Definition at line 154 of file CChangeNotifyServer.cpp.

155{
156 BOOL bFound = FALSE;
157 HWND hwndBroker = NULL;
158 assert(nRegID != INVALID_REG_ID);
159 for (INT i = 0; i < m_items.GetSize(); ++i)
160 {
161 if (m_items[i] && m_items[i]->nRegID == nRegID)
162 {
163 bFound = TRUE;
164 DestroyItem(m_items[i], &hwndBroker);
165 m_items[i] = NULL;
166 }
167 }
168 return bFound;
169}

Referenced by OnUnRegister().

◆ ShouldNotify()

BOOL CChangeNotifyServer::ShouldNotify ( LPDELITICKET  pTicket,
LPREGENTRY  pRegEntry 
)
private

Definition at line 397 of file CChangeNotifyServer.cpp.

398{
399#define RETURN(x) do { \
400 TRACE("ShouldNotify return %d\n", (x)); \
401 return (x); \
402} while (0)
403
404 if (pTicket->wEventId & SHCNE_INTERRUPT)
405 {
406 if (!(pRegEntry->fSources & SHCNRF_InterruptLevel))
407 RETURN(FALSE);
408 if (!pRegEntry->ibPidl)
409 RETURN(FALSE);
410 }
411 else
412 {
413 if (!(pRegEntry->fSources & SHCNRF_ShellLevel))
414 RETURN(FALSE);
415 }
416
417 if (!(pTicket->wEventId & pRegEntry->fEvents))
418 RETURN(FALSE);
419
420 LPITEMIDLIST pidl = NULL, pidl1 = NULL, pidl2 = NULL;
421 if (pRegEntry->ibPidl)
422 pidl = (LPITEMIDLIST)((LPBYTE)pRegEntry + pRegEntry->ibPidl);
423 if (pTicket->ibOffset1)
424 pidl1 = (LPITEMIDLIST)((LPBYTE)pTicket + pTicket->ibOffset1);
425 if (pTicket->ibOffset2)
426 pidl2 = (LPITEMIDLIST)((LPBYTE)pTicket + pTicket->ibOffset2);
427
428 if (pidl == NULL || (pTicket->wEventId & SHCNE_GLOBALEVENTS))
429 RETURN(TRUE);
430
431 if (pRegEntry->fRecursive)
432 {
433 if (ILIsParent(pidl, pidl1, FALSE) ||
434 (pidl2 && ILIsParent(pidl, pidl2, FALSE)))
435 {
436 RETURN(TRUE);
437 }
438 }
439 else
440 {
441 if (ILIsEqual(pidl, pidl1) ||
442 ILIsParent(pidl, pidl1, TRUE) ||
443 (pidl2 && ILIsParent(pidl, pidl2, TRUE)))
444 {
445 RETURN(TRUE);
446 }
447 }
448
449 RETURN(FALSE);
450#undef RETURN
451}
#define RETURN(x)
BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate)
Definition: pidl.c:605
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:548
#define SHCNRF_ShellLevel
Definition: shlobj.h:1921
#define SHCNE_GLOBALEVENTS
Definition: shlobj.h:1898
#define SHCNE_INTERRUPT
Definition: shlobj.h:1900
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by DeliverNotification().

Member Data Documentation

◆ m_items

CSimpleArray<CWatchItem*> CChangeNotifyServer::m_items
private

◆ m_nNextRegID

UINT CChangeNotifyServer::m_nNextRegID
private

Definition at line 75 of file CChangeNotifyServer.cpp.

Referenced by GetNextRegID(), and OnRegister().


The documentation for this class was generated from the following file: