2 * Network Places (Neighbourhood) folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2003 Mike McCormack for CodeWeavers
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/port.h"
32 #define NONAMELESSUNION
33 #define NONAMELESSSTRUCT
41 #include "enumidlist.h"
42 #include "undocshell.h"
43 #include "shell32_main.h"
45 #include "wine/debug.h"
46 #include "wine/unicode.h"
50 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
52 /***********************************************************************
53 * IShellFolder implementation
57 IShellFolder2 IShellFolder2_iface
;
58 IPersistFolder2 IPersistFolder2_iface
;
61 /* both paths are parsible from the desktop */
62 LPITEMIDLIST pidlRoot
; /* absolute pidl */
65 static const IShellFolder2Vtbl vt_ShellFolder2
;
66 static const IPersistFolder2Vtbl vt_NP_PersistFolder2
;
68 static inline IGenericSFImpl
*impl_from_IShellFolder2(IShellFolder2
*iface
)
70 return CONTAINING_RECORD(iface
, IGenericSFImpl
, IShellFolder2_iface
);
73 static inline IGenericSFImpl
*impl_from_IPersistFolder2(IPersistFolder2
*iface
)
75 return CONTAINING_RECORD(iface
, IGenericSFImpl
, IPersistFolder2_iface
);
79 static const shvheader networkplaces_header
[] = {
80 {IDS_SHV_COLUMN1
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
81 {IDS_SHV_COLUMN9
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10}
84 #define NETWORKPLACESSHELLVIEWCOLUMNS sizeof(networkplaces_header)/sizeof(shvheader)
86 /**************************************************************************
87 * ISF_NetworkPlaces_Constructor
89 HRESULT WINAPI
ISF_NetworkPlaces_Constructor (IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
93 TRACE ("unkOut=%p %s\n", pUnkOuter
, shdebugstr_guid (riid
));
98 return CLASS_E_NOAGGREGATION
;
100 sf
= HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof (IGenericSFImpl
));
102 return E_OUTOFMEMORY
;
105 sf
->IShellFolder2_iface
.lpVtbl
= &vt_ShellFolder2
;
106 sf
->IPersistFolder2_iface
.lpVtbl
= &vt_NP_PersistFolder2
;
107 sf
->pidlRoot
= _ILCreateNetHood(); /* my qualified pidl */
109 if (FAILED (IShellFolder2_QueryInterface (&sf
->IShellFolder2_iface
, riid
, ppv
)))
111 IShellFolder2_Release (&sf
->IShellFolder2_iface
);
112 return E_NOINTERFACE
;
115 TRACE ("--(%p)\n", sf
);
119 /**************************************************************************
120 * ISF_NetworkPlaces_fnQueryInterface
123 * supports not IPersist/IPersistFolder
125 static HRESULT WINAPI
ISF_NetworkPlaces_fnQueryInterface (IShellFolder2
*iface
, REFIID riid
, LPVOID
*ppvObj
)
127 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
129 TRACE ("(%p)->(%s,%p)\n", This
, shdebugstr_guid (riid
), ppvObj
);
133 if (IsEqualIID (riid
, &IID_IUnknown
) ||
134 IsEqualIID (riid
, &IID_IShellFolder
) ||
135 IsEqualIID (riid
, &IID_IShellFolder2
))
139 else if (IsEqualIID (riid
, &IID_IPersist
) ||
140 IsEqualIID (riid
, &IID_IPersistFolder
) ||
141 IsEqualIID (riid
, &IID_IPersistFolder2
))
143 *ppvObj
= &This
->IPersistFolder2_iface
;
148 IUnknown_AddRef ((IUnknown
*) (*ppvObj
));
149 TRACE ("-- Interface: (%p)->(%p)\n", ppvObj
, *ppvObj
);
152 TRACE ("-- Interface: E_NOINTERFACE\n");
153 return E_NOINTERFACE
;
156 static ULONG WINAPI
ISF_NetworkPlaces_fnAddRef (IShellFolder2
* iface
)
158 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
159 ULONG refCount
= InterlockedIncrement(&This
->ref
);
161 TRACE ("(%p)->(count=%u)\n", This
, refCount
- 1);
166 static ULONG WINAPI
ISF_NetworkPlaces_fnRelease (IShellFolder2
* iface
)
168 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
169 ULONG refCount
= InterlockedDecrement(&This
->ref
);
171 TRACE ("(%p)->(count=%u)\n", This
, refCount
+ 1);
174 TRACE ("-- destroying IShellFolder(%p)\n", This
);
175 SHFree (This
->pidlRoot
);
176 HeapFree (GetProcessHeap(), 0, This
);
181 /**************************************************************************
182 * ISF_NetworkPlaces_fnParseDisplayName
184 static HRESULT WINAPI
ISF_NetworkPlaces_fnParseDisplayName (IShellFolder2
* iface
,
185 HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
186 DWORD
* pchEaten
, LPITEMIDLIST
* ppidl
, DWORD
* pdwAttributes
)
188 static const WCHAR wszEntireNetwork
[] = {'E','n','t','i','r','e','N','e','t','w','o','r','k'}; /* not nul-terminated */
189 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
190 HRESULT hr
= E_INVALIDARG
;
191 LPCWSTR szNext
= NULL
;
192 WCHAR szElement
[MAX_PATH
];
193 LPITEMIDLIST pidlTemp
= NULL
;
196 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", This
,
197 hwndOwner
, pbcReserved
, lpszDisplayName
, debugstr_w (lpszDisplayName
),
198 pchEaten
, ppidl
, pdwAttributes
);
202 szNext
= GetNextElementW (lpszDisplayName
, szElement
, MAX_PATH
);
203 len
= strlenW(szElement
);
204 if (len
== sizeof(wszEntireNetwork
)/sizeof(wszEntireNetwork
[0]) &&
205 !strncmpiW(szElement
, wszEntireNetwork
, sizeof(wszEntireNetwork
)/sizeof(wszEntireNetwork
[0])))
207 pidlTemp
= _ILCreateEntireNetwork();
214 FIXME("not implemented for %s\n", debugstr_w(lpszDisplayName
));
216 if (SUCCEEDED(hr
) && pidlTemp
)
218 if (szNext
&& *szNext
)
220 hr
= SHELL32_ParseNextElement(iface
, hwndOwner
, pbcReserved
,
221 &pidlTemp
, (LPOLESTR
) szNext
, pchEaten
, pdwAttributes
);
225 if (pdwAttributes
&& *pdwAttributes
)
226 hr
= SHELL32_GetItemAttributes((IShellFolder
*)&This
->IShellFolder2_iface
, pidlTemp
,
236 TRACE ("(%p)->(-- ret=0x%08x)\n", This
, hr
);
241 /**************************************************************************
242 * ISF_NetworkPlaces_fnEnumObjects
244 static HRESULT WINAPI
ISF_NetworkPlaces_fnEnumObjects (IShellFolder2
* iface
,
245 HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
* ppEnumIDList
)
247 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
249 TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This
,
250 hwndOwner
, dwFlags
, ppEnumIDList
);
252 *ppEnumIDList
= IEnumIDList_Constructor();
254 TRACE ("-- (%p)->(new ID List: %p)\n", This
, *ppEnumIDList
);
256 return (*ppEnumIDList
) ? S_OK
: E_OUTOFMEMORY
;
259 /**************************************************************************
260 * ISF_NetworkPlaces_fnBindToObject
262 static HRESULT WINAPI
ISF_NetworkPlaces_fnBindToObject (IShellFolder2
* iface
,
263 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
265 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
267 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This
,
268 pidl
, pbcReserved
, shdebugstr_guid (riid
), ppvOut
);
270 return SHELL32_BindToChild (This
->pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
273 /**************************************************************************
274 * ISF_NetworkPlaces_fnBindToStorage
276 static HRESULT WINAPI
ISF_NetworkPlaces_fnBindToStorage (IShellFolder2
* iface
,
277 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
279 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
281 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This
,
282 pidl
, pbcReserved
, shdebugstr_guid (riid
), ppvOut
);
288 /**************************************************************************
289 * ISF_NetworkPlaces_fnCompareIDs
292 static HRESULT WINAPI
ISF_NetworkPlaces_fnCompareIDs (IShellFolder2
* iface
,
293 LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
295 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
298 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This
, lParam
, pidl1
, pidl2
);
299 nReturn
= SHELL32_CompareIDs ((IShellFolder
*)&This
->IShellFolder2_iface
, lParam
, pidl1
, pidl2
);
300 TRACE ("-- %i\n", nReturn
);
304 /**************************************************************************
305 * ISF_NetworkPlaces_fnCreateViewObject
307 static HRESULT WINAPI
ISF_NetworkPlaces_fnCreateViewObject (IShellFolder2
* iface
,
308 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
310 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
311 LPSHELLVIEW pShellView
;
312 HRESULT hr
= E_INVALIDARG
;
314 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This
,
315 hwndOwner
, shdebugstr_guid (riid
), ppvOut
);
322 if (IsEqualIID (riid
, &IID_IDropTarget
))
324 WARN ("IDropTarget not implemented\n");
327 else if (IsEqualIID (riid
, &IID_IContextMenu
))
329 WARN ("IContextMenu not implemented\n");
332 else if (IsEqualIID (riid
, &IID_IShellView
))
334 pShellView
= IShellView_Constructor ((IShellFolder
*) iface
);
337 hr
= IShellView_QueryInterface (pShellView
, riid
, ppvOut
);
338 IShellView_Release (pShellView
);
341 TRACE ("-- (%p)->(interface=%p)\n", This
, ppvOut
);
345 /**************************************************************************
346 * ISF_NetworkPlaces_fnGetAttributesOf
348 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetAttributesOf (IShellFolder2
* iface
,
349 UINT cidl
, LPCITEMIDLIST
* apidl
, DWORD
* rgfInOut
)
351 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
354 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This
,
355 cidl
, apidl
, rgfInOut
, rgfInOut
? *rgfInOut
: 0);
367 IShellFolder
*psfParent
= NULL
;
368 LPCITEMIDLIST rpidl
= NULL
;
370 hr
= SHBindToParent(This
->pidlRoot
, &IID_IShellFolder
, (void**)&psfParent
, &rpidl
);
373 SHELL32_GetItemAttributes (psfParent
, rpidl
, rgfInOut
);
374 IShellFolder_Release(psfParent
);
379 while (cidl
> 0 && *apidl
)
382 SHELL32_GetItemAttributes ((IShellFolder
*)&This
->IShellFolder2_iface
, *apidl
, rgfInOut
);
388 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
389 *rgfInOut
&= ~SFGAO_VALIDATE
;
391 TRACE ("-- result=0x%08x\n", *rgfInOut
);
395 /**************************************************************************
396 * ISF_NetworkPlaces_fnGetUIObjectOf
399 * hwndOwner [in] Parent window for any output
400 * cidl [in] array size
401 * apidl [in] simple pidl array
402 * riid [in] Requested Interface
403 * prgfInOut [ ] reserved
404 * ppvObject [out] Resulting Interface
407 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetUIObjectOf (IShellFolder2
* iface
,
408 HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
* apidl
, REFIID riid
,
409 UINT
* prgfInOut
, LPVOID
* ppvOut
)
411 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
414 IUnknown
*pObj
= NULL
;
415 HRESULT hr
= E_INVALIDARG
;
417 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", This
,
418 hwndOwner
, cidl
, apidl
, shdebugstr_guid (riid
), prgfInOut
, ppvOut
);
425 if (IsEqualIID (riid
, &IID_IContextMenu
) && (cidl
>= 1))
427 pObj
= (LPUNKNOWN
) ISvItemCm_Constructor ((IShellFolder
*) iface
, This
->pidlRoot
, apidl
, cidl
);
430 else if (IsEqualIID (riid
, &IID_IDataObject
) && (cidl
>= 1))
432 pObj
= (LPUNKNOWN
) IDataObject_Constructor (hwndOwner
, This
->pidlRoot
, apidl
, cidl
);
435 else if (IsEqualIID (riid
, &IID_IExtractIconA
) && (cidl
== 1))
437 pidl
= ILCombine (This
->pidlRoot
, apidl
[0]);
438 pObj
= (LPUNKNOWN
) IExtractIconA_Constructor (pidl
);
442 else if (IsEqualIID (riid
, &IID_IExtractIconW
) && (cidl
== 1))
444 pidl
= ILCombine (This
->pidlRoot
, apidl
[0]);
445 pObj
= (LPUNKNOWN
) IExtractIconW_Constructor (pidl
);
449 else if (IsEqualIID (riid
, &IID_IDropTarget
) && (cidl
>= 1))
451 hr
= IShellFolder_QueryInterface (iface
, &IID_IDropTarget
, (LPVOID
*) & pObj
);
456 if (SUCCEEDED(hr
) && !pObj
)
460 TRACE ("(%p)->hr=0x%08x\n", This
, hr
);
464 /**************************************************************************
465 * ISF_NetworkPlaces_fnGetDisplayNameOf
468 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDisplayNameOf (IShellFolder2
* iface
,
469 LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
)
471 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
473 FIXME ("(%p)->(pidl=%p,0x%08x,%p)\n", This
, pidl
, dwFlags
, strRet
);
482 /**************************************************************************
483 * ISF_NetworkPlaces_fnSetNameOf
484 * Changes the name of a file object or subfolder, possibly changing its item
485 * identifier in the process.
488 * hwndOwner [in] Owner window for output
489 * pidl [in] simple pidl of item to change
490 * lpszName [in] the items new display name
491 * dwFlags [in] SHGNO formatting flags
492 * ppidlOut [out] simple pidl returned
494 static HRESULT WINAPI
ISF_NetworkPlaces_fnSetNameOf (IShellFolder2
* iface
,
495 HWND hwndOwner
, LPCITEMIDLIST pidl
, /*simple pidl */
496 LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
* pPidlOut
)
498 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
500 FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This
,
501 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
505 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDefaultSearchGUID (
506 IShellFolder2
* iface
, GUID
* pguid
)
508 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
510 FIXME ("(%p)\n", This
);
514 static HRESULT WINAPI
ISF_NetworkPlaces_fnEnumSearches (IShellFolder2
* iface
,
515 IEnumExtraSearch
** ppenum
)
517 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
519 FIXME ("(%p)\n", This
);
523 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDefaultColumn (IShellFolder2
* iface
,
524 DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
526 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
528 TRACE ("(%p)\n", This
);
538 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDefaultColumnState (
539 IShellFolder2
* iface
, UINT iColumn
, DWORD
* pcsFlags
)
541 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
543 TRACE ("(%p)->(%d %p)\n", This
, iColumn
, pcsFlags
);
545 if (!pcsFlags
|| iColumn
>= NETWORKPLACESSHELLVIEWCOLUMNS
)
548 *pcsFlags
= networkplaces_header
[iColumn
].pcsFlags
;
553 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDetailsEx (IShellFolder2
* iface
,
554 LPCITEMIDLIST pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
556 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
558 FIXME ("(%p)\n", This
);
562 static HRESULT WINAPI
ISF_NetworkPlaces_fnGetDetailsOf (IShellFolder2
* iface
,
563 LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
565 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
567 FIXME ("(%p)->(%p %i %p)\n", This
, pidl
, iColumn
, psd
);
572 static HRESULT WINAPI
ISF_NetworkPlaces_fnMapColumnToSCID (IShellFolder2
* iface
,
573 UINT column
, SHCOLUMNID
* pscid
)
575 IGenericSFImpl
*This
= impl_from_IShellFolder2(iface
);
577 FIXME ("(%p)\n", This
);
582 static const IShellFolder2Vtbl vt_ShellFolder2
= {
583 ISF_NetworkPlaces_fnQueryInterface
,
584 ISF_NetworkPlaces_fnAddRef
,
585 ISF_NetworkPlaces_fnRelease
,
586 ISF_NetworkPlaces_fnParseDisplayName
,
587 ISF_NetworkPlaces_fnEnumObjects
,
588 ISF_NetworkPlaces_fnBindToObject
,
589 ISF_NetworkPlaces_fnBindToStorage
,
590 ISF_NetworkPlaces_fnCompareIDs
,
591 ISF_NetworkPlaces_fnCreateViewObject
,
592 ISF_NetworkPlaces_fnGetAttributesOf
,
593 ISF_NetworkPlaces_fnGetUIObjectOf
,
594 ISF_NetworkPlaces_fnGetDisplayNameOf
,
595 ISF_NetworkPlaces_fnSetNameOf
,
597 ISF_NetworkPlaces_fnGetDefaultSearchGUID
,
598 ISF_NetworkPlaces_fnEnumSearches
,
599 ISF_NetworkPlaces_fnGetDefaultColumn
,
600 ISF_NetworkPlaces_fnGetDefaultColumnState
,
601 ISF_NetworkPlaces_fnGetDetailsEx
,
602 ISF_NetworkPlaces_fnGetDetailsOf
,
603 ISF_NetworkPlaces_fnMapColumnToSCID
606 /************************************************************************
607 * INPFldr_PersistFolder2_QueryInterface
609 static HRESULT WINAPI
INPFldr_PersistFolder2_QueryInterface (IPersistFolder2
* iface
,
610 REFIID iid
, LPVOID
* ppvObj
)
612 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
614 TRACE ("(%p)\n", This
);
616 return IShellFolder2_QueryInterface (&This
->IShellFolder2_iface
, iid
, ppvObj
);
619 /************************************************************************
620 * INPFldr_PersistFolder2_AddRef
622 static ULONG WINAPI
INPFldr_PersistFolder2_AddRef (IPersistFolder2
* iface
)
624 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
626 TRACE ("(%p)->(count=%u)\n", This
, This
->ref
);
628 return IShellFolder2_AddRef (&This
->IShellFolder2_iface
);
631 /************************************************************************
632 * ISFPersistFolder_Release
634 static ULONG WINAPI
INPFldr_PersistFolder2_Release (IPersistFolder2
* iface
)
636 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
638 TRACE ("(%p)->(count=%u)\n", This
, This
->ref
);
640 return IShellFolder2_Release (&This
->IShellFolder2_iface
);
643 /************************************************************************
644 * INPFldr_PersistFolder2_GetClassID
646 static HRESULT WINAPI
INPFldr_PersistFolder2_GetClassID (
647 IPersistFolder2
* iface
, CLSID
* lpClassId
)
649 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
651 TRACE ("(%p)\n", This
);
656 *lpClassId
= CLSID_NetworkPlaces
;
661 /************************************************************************
662 * INPFldr_PersistFolder2_Initialize
664 * NOTES: it makes no sense to change the pidl
666 static HRESULT WINAPI
INPFldr_PersistFolder2_Initialize (
667 IPersistFolder2
* iface
, LPCITEMIDLIST pidl
)
669 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
671 TRACE ("(%p)->(%p)\n", This
, pidl
);
676 /**************************************************************************
677 * IPersistFolder2_fnGetCurFolder
679 static HRESULT WINAPI
INPFldr_PersistFolder2_GetCurFolder (
680 IPersistFolder2
* iface
, LPITEMIDLIST
* pidl
)
682 IGenericSFImpl
*This
= impl_from_IPersistFolder2(iface
);
684 TRACE ("(%p)->(%p)\n", This
, pidl
);
689 *pidl
= ILClone (This
->pidlRoot
);
694 static const IPersistFolder2Vtbl vt_NP_PersistFolder2
=
696 INPFldr_PersistFolder2_QueryInterface
,
697 INPFldr_PersistFolder2_AddRef
,
698 INPFldr_PersistFolder2_Release
,
699 INPFldr_PersistFolder2_GetClassID
,
700 INPFldr_PersistFolder2_Initialize
,
701 INPFldr_PersistFolder2_GetCurFolder