2 * Virtual Printers Folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2005 Huw Davies
7 * Copyright 2009 Andrew Hill
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
30 /***********************************************************************
31 * Printers_IExtractIconW implementation
33 class CPrintersExtractIconW
:
34 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
41 CPrintersExtractIconW();
42 ~CPrintersExtractIconW();
43 HRESULT WINAPI
Initialize(LPCITEMIDLIST pidl
);
46 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, LPWSTR szIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
47 virtual HRESULT STDMETHODCALLTYPE
Extract(LPCWSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
50 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, LPSTR szIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
51 virtual HRESULT STDMETHODCALLTYPE
Extract(LPCSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
53 BEGIN_COM_MAP(CPrintersExtractIconW
)
54 COM_INTERFACE_ENTRY_IID(IID_IExtractIconW
, IExtractIconW
)
55 COM_INTERFACE_ENTRY_IID(IID_IExtractIconA
, IExtractIconA
)
59 static shvheader PrinterSFHeader
[] = {
60 {IDS_SHV_COLUMN8
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
61 {IDS_SHV_COLUMN_DOCUMENTS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
62 {IDS_SHV_COLUMN_STATUS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
63 {IDS_SHV_COLUMN_COMMENTS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
64 {IDS_SHV_COLUMN_LOCATION
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
65 {IDS_SHV_COLUMN_MODEL
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15}
69 #define COLUMN_DOCUMENTS 1
70 #define COLUMN_STATUS 2
71 #define COLUMN_COMMENTS 3
72 #define COLUMN_LOCATION 4
73 #define COLUMN_MODEL 5
76 #define PrinterSHELLVIEWCOLUMNS (6)
78 CPrintersExtractIconW::CPrintersExtractIconW()
83 CPrintersExtractIconW::~CPrintersExtractIconW()
85 TRACE(" destroying IExtractIcon(%p)\n", this);
89 HRESULT WINAPI
CPrintersExtractIconW::Initialize(LPCITEMIDLIST pidl
)
97 /**************************************************************************
98 * CPrintersExtractIconW::GetIconLocation
100 * mapping filetype to icon
102 HRESULT WINAPI
CPrintersExtractIconW::GetIconLocation(UINT uFlags
, /* GIL_ flags */
106 UINT
*pwFlags
) /* returned GIL_ flags */
108 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags
, szIconFile
, cchMax
, piIndex
, pwFlags
);
113 lstrcpynW(szIconFile
, swShell32Name
, cchMax
);
114 *piIndex
= -IDI_SHELL_PRINTERS_FOLDER
; /* FIXME: other icons for default, network, print to file */
116 TRACE("-- %s %x\n", debugstr_w(szIconFile
), *piIndex
);
120 /**************************************************************************
121 * CPrintersExtractIconW::Extract
123 HRESULT WINAPI
CPrintersExtractIconW::Extract(LPCWSTR pszFile
,
124 UINT nIconIndex
, HICON
*phiconLarge
,
125 HICON
*phiconSmall
, UINT nIconSize
)
129 FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", this, debugstr_w(pszFile
),
130 (signed)nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
132 index
= SIC_GetIconIndex(pszFile
, nIconIndex
, 0);
135 *phiconLarge
= ImageList_GetIcon(ShellBigIconList
, index
, ILD_TRANSPARENT
);
138 *phiconSmall
= ImageList_GetIcon(ShellSmallIconList
, index
, ILD_TRANSPARENT
);
143 /**************************************************************************
144 * CPrintersExtractIconW::GetIconLocation
146 HRESULT WINAPI
CPrintersExtractIconW::GetIconLocation(UINT uFlags
,
153 LPWSTR lpwstrFile
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, cchMax
* sizeof(WCHAR
));
155 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags
, szIconFile
, cchMax
, piIndex
, pwFlags
);
157 ret
= GetIconLocation(uFlags
, lpwstrFile
, cchMax
, piIndex
, pwFlags
);
158 WideCharToMultiByte(CP_ACP
, 0, lpwstrFile
, -1, szIconFile
, cchMax
, NULL
, NULL
);
159 HeapFree(GetProcessHeap(), 0, lpwstrFile
);
161 TRACE("-- %s %x\n", szIconFile
, *piIndex
);
164 /**************************************************************************
165 * CPrintersExtractIconW::Extract
167 HRESULT WINAPI
CPrintersExtractIconW::Extract(LPCSTR pszFile
,
168 UINT nIconIndex
, HICON
*phiconLarge
,
169 HICON
*phiconSmall
, UINT nIconSize
)
172 INT len
= MultiByteToWideChar(CP_ACP
, 0, pszFile
, -1, NULL
, 0);
173 LPWSTR lpwstrFile
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
175 TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", this, pszFile
, nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
177 MultiByteToWideChar(CP_ACP
, 0, pszFile
, -1, lpwstrFile
, len
);
178 ret
= Extract(lpwstrFile
, nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
179 HeapFree(GetProcessHeap(), 0, lpwstrFile
);
183 /**************************************************************************
184 * IExtractIcon_Constructor
186 static HRESULT WINAPI
IEI_Printers_Constructor(LPCITEMIDLIST pidl
, REFIID riid
, IUnknown
**ppv
)
188 CComObject
<CPrintersExtractIconW
> *theExtractor
;
189 CComPtr
<IUnknown
> result
;
195 ATLTRY (theExtractor
= new CComObject
<CPrintersExtractIconW
>);
196 if (theExtractor
== NULL
)
197 return E_OUTOFMEMORY
;
198 hResult
= theExtractor
->QueryInterface(riid
, (void **)&result
);
199 if (FAILED (hResult
))
204 hResult
= theExtractor
->Initialize(pidl
);
205 if (FAILED (hResult
))
207 *ppv
= result
.Detach();
211 /***********************************************************************
212 * Printers folder implementation
215 class CPrintersEnum
: public IEnumIDListImpl
220 HRESULT WINAPI
Initialize(HWND hwndOwner
, DWORD dwFlags
);
221 BOOL
CreatePrintersEnumList(DWORD dwFlags
);
223 BEGIN_COM_MAP(CPrintersEnum
)
224 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
228 CPrintersEnum::CPrintersEnum()
232 CPrintersEnum::~CPrintersEnum()
236 HRESULT WINAPI
CPrintersEnum::Initialize(HWND hwndOwner
, DWORD dwFlags
)
238 if (CreatePrintersEnumList(dwFlags
) == FALSE
)
243 static LPITEMIDLIST
_ILCreatePrinterItem(PRINTER_INFO_4W
*pi
)
247 PIDLPrinterStruct
* p
;
248 int size0
= (char*)&tmp
.u
.cprinter
.szName
- (char*)&tmp
.u
.cprinter
;
252 tmp
.u
.cprinter
.dummy
= 0xFF;
253 if (pi
->pPrinterName
)
254 tmp
.u
.cprinter
.offsServer
= wcslen(pi
->pPrinterName
) + 1;
256 tmp
.u
.cprinter
.offsServer
= 1;
258 size
+= tmp
.u
.cprinter
.offsServer
* sizeof(WCHAR
);
260 size
+= (wcslen(pi
->pServerName
) + 1) * sizeof(WCHAR
);
262 size
+= sizeof(WCHAR
);
264 pidl
= (LPITEMIDLIST
)SHAlloc(size
+ 4);
268 pidl
->mkid
.cb
= size
+ 2;
269 memcpy(pidl
->mkid
.abID
, &tmp
, 2 + size0
);
271 p
= &((PIDLDATA
*)pidl
->mkid
.abID
)->u
.cprinter
;
273 p
->Attributes
= pi
->Attributes
;
274 if (pi
->pPrinterName
)
275 wcscpy(p
->szName
, pi
->pPrinterName
);
277 p
->szName
[0] = L
'\0';
280 wcscpy(p
->szName
+ p
->offsServer
, pi
->pServerName
);
282 p
->szName
[p
->offsServer
] = L
'\0';
284 *(WORD
*)((char*)pidl
+ (size
+ 2)) = 0;
288 /**************************************************************************
289 * CPrintersEnum::CreatePrintersEnumList()
291 BOOL
CPrintersEnum::CreatePrintersEnumList(DWORD dwFlags
)
295 TRACE("(%p)->(flags=0x%08lx) \n", this, dwFlags
);
297 /* enumerate the folders */
298 if (dwFlags
& SHCONTF_NONFOLDERS
)
300 DWORD needed
= 0, num
= 0, i
;
303 EnumPrintersW(PRINTER_ENUM_LOCAL
, NULL
, 4, NULL
, 0, &needed
, &num
);
307 pi
= (PRINTER_INFO_4W
*)HeapAlloc(GetProcessHeap(), 0, needed
);
308 if(!EnumPrintersW(PRINTER_ENUM_LOCAL
, NULL
, 4, (LPBYTE
)pi
, needed
, &needed
, &num
)) {
309 HeapFree(GetProcessHeap(), 0, pi
);
313 for(i
= 0; i
< num
; i
++) {
314 LPITEMIDLIST pidl
= _ILCreatePrinterItem(&pi
[i
]);
317 if (!AddToEnumList(pidl
))
321 HeapFree(GetProcessHeap(), 0, pi
);
326 CPrinterFolder::CPrinterFolder()
333 CPrinterFolder::~CPrinterFolder()
335 TRACE("-- destroying IShellFolder(%p)\n", this);
340 HRESULT WINAPI
CPrinterFolder::FinalConstruct()
342 pidlRoot
= _ILCreatePrinters(); /* my qualified pidl */
343 if (pidlRoot
== NULL
)
344 return E_OUTOFMEMORY
;
348 /**************************************************************************
349 * CPrinterFolder::ParseDisplayName
351 * This is E_NOTIMPL in Windows too.
353 HRESULT WINAPI
CPrinterFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
354 DWORD
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, DWORD
*pdwAttributes
)
356 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
357 this, hwndOwner
, pbc
, lpszDisplayName
, debugstr_w(lpszDisplayName
),
358 pchEaten
, ppidl
, pdwAttributes
);
367 static PIDLPrinterStruct
* _ILGetPrinterStruct(LPCITEMIDLIST pidl
)
369 LPPIDLDATA pdata
= _ILGetDataPointer(pidl
);
371 if (pdata
&& pdata
->type
== 0x00)
372 return (PIDLPrinterStruct
*) & (pdata
->u
.cfont
);
377 /**************************************************************************
378 * CPrinterFolder::EnumObjects
380 HRESULT WINAPI
CPrinterFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
* ppEnumIDList
)
382 CComObject
<CPrintersEnum
> *theEnumerator
;
383 CComPtr
<IEnumIDList
> result
;
386 TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner
, dwFlags
, ppEnumIDList
);
388 if (ppEnumIDList
== NULL
)
390 *ppEnumIDList
= NULL
;
391 ATLTRY (theEnumerator
= new CComObject
<CPrintersEnum
>);
392 if (theEnumerator
== NULL
)
393 return E_OUTOFMEMORY
;
394 hResult
= theEnumerator
->QueryInterface(IID_PPV_ARG(IEnumIDList
, &result
));
395 if (FAILED (hResult
))
397 delete theEnumerator
;
400 hResult
= theEnumerator
->Initialize(hwndOwner
, dwFlags
);
401 if (FAILED (hResult
))
403 *ppEnumIDList
= result
.Detach();
405 TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList
);
410 /**************************************************************************
411 * CPrinterFolder::BindToObject
413 HRESULT WINAPI
CPrinterFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
415 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this,
416 pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
418 return SHELL32_BindToChild(pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
421 /**************************************************************************
422 * ISF_Printers_fnBindToStorage
424 HRESULT WINAPI
CPrinterFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
426 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
427 this, pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
433 /**************************************************************************
434 * CPrinterFolder::CompareIDs
436 HRESULT WINAPI
CPrinterFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
440 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam
, pidl1
, pidl2
);
441 nReturn
= SHELL32_CompareIDs (this, lParam
, pidl1
, pidl2
);
442 TRACE ("-- %i\n", nReturn
);
446 /**************************************************************************
447 * CPrinterFolder::CreateViewObject
449 HRESULT WINAPI
CPrinterFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
451 CComPtr
<IShellView
> pShellView
;
452 HRESULT hr
= E_INVALIDARG
;
454 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
455 hwndOwner
, shdebugstr_guid (&riid
), ppvOut
);
462 if (IsEqualIID(riid
, IID_IDropTarget
))
464 WARN("IDropTarget not implemented\n");
467 else if(IsEqualIID(riid
, IID_IContextMenu
))
469 WARN("IContextMenu not implemented\n");
472 else if(IsEqualIID(riid
, IID_IShellView
))
474 hr
= IShellView_Constructor((IShellFolder
*)this, &pShellView
);
477 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
478 pShellView
->Release();
481 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut
);
485 /**************************************************************************
486 * CPrinterFolder::GetAttributesOf
488 HRESULT WINAPI
CPrinterFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
490 static const DWORD dwPrintersAttributes
=
491 SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
| SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
494 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
495 this, cidl
, apidl
, *rgfInOut
);
497 *rgfInOut
&= dwPrintersAttributes
;
499 *rgfInOut
&= ~SFGAO_VALIDATE
;
501 TRACE ("-- result=0x%08x\n", *rgfInOut
);
505 /**************************************************************************
506 * CPrinterFolder::GetUIObjectOf
509 * HWND hwndOwner, //[in ] Parent window for any output
510 * UINT cidl, //[in ] array size
511 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
512 * REFIID riid, //[in ] Requested Interface
513 * UINT* prgfInOut, //[ ] reserved
514 * LPVOID* ppvObject) //[out] Resulting Interface
517 HRESULT WINAPI
CPrinterFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
518 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
520 IUnknown
*pObj
= NULL
;
521 HRESULT hr
= E_INVALIDARG
;
523 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
524 this, hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
531 if ((IsEqualIID (riid
, IID_IExtractIconA
) || IsEqualIID(riid
, IID_IExtractIconW
)) && cidl
== 1)
532 hr
= IEI_Printers_Constructor(apidl
[0], riid
, &pObj
);
536 if (SUCCEEDED(hr
) && !pObj
)
540 TRACE ("(%p)->hr=0x%08lx\n", this, hr
);
544 /**************************************************************************
545 * CPrinterFolder::GetDisplayNameOf
548 HRESULT WINAPI
CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
551 PIDLPrinterStruct
* p
;
553 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl
, dwFlags
, strRet
);
564 pszName
= (LPWSTR
)CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
));
566 return E_OUTOFMEMORY
;
568 if (LoadStringW(shell32_hInstance
, IDS_PRINTERS
, pszName
, MAX_PATH
))
570 pszName
[MAX_PATH
-1] = L
'\0';
571 strRet
->uType
= STRRET_WSTR
;
572 strRet
->pOleStr
= pszName
;
575 CoTaskMemFree(pszName
);
579 p
= _ILGetPrinterStruct(pidl
);
582 WARN("no printer struct\n");
585 strRet
->pOleStr
= (LPWSTR
)SHAlloc(p
->offsServer
* sizeof(WCHAR
));
586 if (!strRet
->pOleStr
)
587 return E_OUTOFMEMORY
;
589 memcpy((LPVOID
)strRet
->pOleStr
, (LPVOID
)p
->szName
, p
->offsServer
* sizeof(WCHAR
));
590 TRACE("ret %s\n", debugstr_w(strRet
->pOleStr
));
595 /**************************************************************************
596 * CPrinterFolder::SetNameOf
597 * Changes the name of a file object or subfolder, possibly changing its item
598 * identifier in the process.
601 * HWND hwndOwner, //[in ] Owner window for output
602 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
603 * LPCOLESTR lpszName, //[in ] the items new display name
604 * DWORD dwFlags, //[in ] SHGNO formatting flags
605 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
607 HRESULT WINAPI
CPrinterFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /* simple pidl */
608 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
610 FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner
, pidl
,
611 debugstr_w (lpName
), dwFlags
, pPidlOut
);
616 HRESULT WINAPI
CPrinterFolder::GetDefaultSearchGUID(GUID
*pguid
)
618 FIXME("(%p)\n", this);
622 HRESULT WINAPI
CPrinterFolder::EnumSearches(IEnumExtraSearch
**ppenum
)
624 FIXME("(%p)\n", this);
628 HRESULT WINAPI
CPrinterFolder::GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
638 HRESULT WINAPI
CPrinterFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
640 if (!pcsFlags
|| iColumn
>= PrinterSHELLVIEWCOLUMNS
)
642 *pcsFlags
= PrinterSFHeader
[iColumn
].pcsFlags
;
647 HRESULT WINAPI
CPrinterFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
649 FIXME("(%p): stub\n", this);
654 HRESULT WINAPI
CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
656 WCHAR buffer
[MAX_PATH
] = {0};
659 TRACE("(%p)->(%p %i %p): stub\n", this, pidl
, iColumn
, psd
);
661 if (iColumn
>= PrinterSHELLVIEWCOLUMNS
)
664 psd
->fmt
= PrinterSFHeader
[iColumn
].fmt
;
665 psd
->cxChar
= PrinterSFHeader
[iColumn
].cxChar
;
668 psd
->str
.uType
= STRRET_WSTR
;
669 if (LoadStringW(shell32_hInstance
, PrinterSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
670 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
675 if (iColumn
== COLUMN_NAME
)
677 psd
->str
.uType
= STRRET_WSTR
;
678 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
681 psd
->str
.uType
= STRRET_CSTR
;
682 psd
->str
.cStr
[0] = '\0';
687 HRESULT WINAPI
CPrinterFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
689 FIXME ("(%p): stub\n", this);
693 /************************************************************************
694 * CPrinterFolder::GetClassID
696 HRESULT WINAPI
CPrinterFolder::GetClassID(CLSID
*lpClassId
)
698 TRACE ("(%p)\n", this);
700 *lpClassId
= CLSID_Printers
;
705 /************************************************************************
706 * CPrinterFolder::Initialize
708 HRESULT WINAPI
CPrinterFolder::Initialize(LPCITEMIDLIST pidl
)
711 SHFree((LPVOID
)pidlRoot
);
713 pidlRoot
= ILClone(pidl
);
717 /**************************************************************************
718 * CPrinterFolder::GetCurFolder
720 HRESULT WINAPI
CPrinterFolder::GetCurFolder(LPITEMIDLIST
* pidl
)
722 TRACE ("(%p)->(%p)\n", this, pidl
);
724 *pidl
= ILClone (pidlRoot
);