ReactOS 0.4.15-dev-8231-g29a56f3
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 462 of file CChangeNotifyServer.cpp.

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

◆ DeliverNotification()

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

Definition at line 354 of file CChangeNotifyServer.cpp.

355{
356 TRACE("DeliverNotification(%p, %p, 0x%lx)\n", m_hWnd, hTicket, dwOwnerPID);
357
358 // lock the delivery ticket
359 LPDELITICKET pTicket = (LPDELITICKET)SHLockSharedEx(hTicket, dwOwnerPID, FALSE);
360 if (pTicket == NULL || pTicket->dwMagic != DELITICKET_MAGIC)
361 {
362 ERR("pTicket is invalid\n");
363 SHUnlockShared(pTicket);
364 return FALSE;
365 }
366
367 // for all items
368 for (INT i = 0; i < m_items.GetSize(); ++i)
369 {
370 if (m_items[i] == NULL)
371 continue;
372
373 LPREGENTRY pRegEntry = m_items[i]->pRegEntry;
374 if (pRegEntry == NULL || pRegEntry->dwMagic != REGENTRY_MAGIC)
375 {
376 ERR("pRegEntry is invalid\n");
377 continue;
378 }
379
380 // should we notify for it?
381 BOOL bNotify = ShouldNotify(pTicket, pRegEntry);
382 if (bNotify)
383 {
384 // do notify
385 TRACE("Notifying: %p, 0x%x, %p, %lu\n",
386 pRegEntry->hwnd, pRegEntry->uMsg, hTicket, dwOwnerPID);
387 SendMessageW(pRegEntry->hwnd, pRegEntry->uMsg, (WPARAM)hTicket, dwOwnerPID);
388 TRACE("GetLastError(): %ld\n", ::GetLastError());
389 }
390 }
391
392 // unlock the ticket
393 SHUnlockShared(pTicket);
394
395 return TRUE;
396}
struct DELITICKET * LPDELITICKET
#define REGENTRY_MAGIC
#define DELITICKET_MAGIC
#define ERR(fmt,...)
Definition: debug.h:113
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 344 of file CChangeNotifyServer.cpp.

345{
346 m_nNextRegID++;
348 m_nNextRegID++;
349 return m_nNextRegID;
350}

Referenced by OnRegister().

◆ GetWindow()

HRESULT WINAPI CChangeNotifyServer::GetWindow ( HWND lphwnd)
override

Implements IOleWindow.

Definition at line 454 of file CChangeNotifyServer.cpp.

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

◆ Initialize()

HRESULT CChangeNotifyServer::Initialize ( )

Definition at line 467 of file CChangeNotifyServer.cpp.

468{
469 // This is called by CChangeNotifyServer_CreateInstance right after instantiation.
471 if (!hwnd)
472 return E_FAIL;
474 return S_OK;
475}
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 300 of file CChangeNotifyServer.cpp.

301{
302 TRACE("OnDeliverNotification(%p, %u, %p, %p)\n", m_hWnd, uMsg, wParam, lParam);
303
304 HANDLE hTicket = (HANDLE)wParam;
305 DWORD dwOwnerPID = (DWORD)lParam;
306
307 // do delivery
308 BOOL ret = DeliverNotification(hTicket, dwOwnerPID);
309
310 // free the ticket
311 SHFreeShared(hTicket, dwOwnerPID);
312 return ret;
313}
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 336 of file CChangeNotifyServer.cpp.

◆ OnRegister()

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

Definition at line 214 of file CChangeNotifyServer.cpp.

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

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

◆ OnSuspendResume()

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

Definition at line 317 of file CChangeNotifyServer.cpp.

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

◆ OnUnRegister()

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

Definition at line 280 of file CChangeNotifyServer.cpp.

281{
282 TRACE("OnUnRegister(%p, %u, %p, %p)\n", m_hWnd, uMsg, wParam, lParam);
283
284 // validate registration ID
285 UINT nRegID = (UINT)wParam;
286 if (nRegID == INVALID_REG_ID)
287 {
288 ERR("INVALID_REG_ID\n");
289 return FALSE;
290 }
291
292 // remove it
293 return RemoveItemsByRegID(nRegID);
294}
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 398 of file CChangeNotifyServer.cpp.

399{
400#define RETURN(x) do { \
401 TRACE("ShouldNotify return %d\n", (x)); \
402 return (x); \
403} while (0)
404
405 if (pTicket->wEventId & SHCNE_INTERRUPT)
406 {
407 if (!(pRegEntry->fSources & SHCNRF_InterruptLevel))
408 RETURN(FALSE);
409 if (!pRegEntry->ibPidl)
410 RETURN(FALSE);
411 }
412 else
413 {
414 if (!(pRegEntry->fSources & SHCNRF_ShellLevel))
415 RETURN(FALSE);
416 }
417
418 if (!(pTicket->wEventId & pRegEntry->fEvents))
419 RETURN(FALSE);
420
421 LPITEMIDLIST pidl = NULL, pidl1 = NULL, pidl2 = NULL;
422 if (pRegEntry->ibPidl)
423 pidl = (LPITEMIDLIST)((LPBYTE)pRegEntry + pRegEntry->ibPidl);
424 if (pTicket->ibOffset1)
425 pidl1 = (LPITEMIDLIST)((LPBYTE)pTicket + pTicket->ibOffset1);
426 if (pTicket->ibOffset2)
427 pidl2 = (LPITEMIDLIST)((LPBYTE)pTicket + pTicket->ibOffset2);
428
429 if (pidl == NULL || (pTicket->wEventId & SHCNE_GLOBALEVENTS))
430 RETURN(TRUE);
431
432 if (pRegEntry->fRecursive)
433 {
434 if (ILIsParent(pidl, pidl1, FALSE) ||
435 (pidl2 && ILIsParent(pidl, pidl2, FALSE)))
436 {
437 RETURN(TRUE);
438 }
439 }
440 else
441 {
442 if (ILIsEqual(pidl, pidl1) ||
443 ILIsParent(pidl, pidl1, TRUE) ||
444 (pidl2 && ILIsParent(pidl, pidl2, TRUE)))
445 {
446 RETURN(TRUE);
447 }
448 }
449
450 RETURN(FALSE);
451#undef RETURN
452}
#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:1929
#define SHCNE_GLOBALEVENTS
Definition: shlobj.h:1906
#define SHCNE_INTERRUPT
Definition: shlobj.h:1908
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: