// Create a shell item array object that can be accessed using IObjectCollection
// or IShellItemArray. IObjectCollection lets items be added or removed from the collection.
// For code that needs to run on Vista use SHCreateShellItemArrayFromIDLists()
HRESULT CreateShellItemArray(REFIID riid, void **ppv)
{
    *ppv = NULL;
    IShellLibrary *pLibrary;
    HRESULT hr = CoCreateInstance(CLSID_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pLibrary));
    if (SUCCEEDED(hr))
    {
        hr = pLibrary->GetFolders(LFF_ALLITEMS, riid, ppv);
        pLibrary->Release();
    }
    return hr;
}
// @pymethod <o PyIShellItemArray>|PyIShellLibrary|GetFolders|Retrieves a collection of folders in the library
PyObject *PyIShellLibrary::GetFolders(PyObject *self, PyObject *args)
{
	IShellLibrary *pISL = GetI(self);
	if ( pISL == NULL )
		return NULL;
	// @pyparm int|Filter|LFF_ALLITEMS|Specifies what types of folder to return (shellcon.LFF_*)
	// @pyparm <o PyIID>|riid|IID_IShellItemArray|The interface to return, IObjectCollection and IObjectArray also accepted.
	LIBRARYFOLDERFILTER Filter = LFF_ALLITEMS;
	IID riid = IID_IShellItemArray;
	void *pv;
	if ( !PyArg_ParseTuple(args, "|iO&:GetFolders", &Filter, PyWinObject_AsIID, &riid))
		return NULL;
	HRESULT hr;
	PY_INTERFACE_PRECALL;
	hr = pISL->GetFolders(Filter, riid, &pv);
	PY_INTERFACE_POSTCALL;

	if ( FAILED(hr) )
		return PyCom_BuildPyException(hr, pISL, IID_IShellLibrary );
	return PyCom_PyObjectFromIUnknown((IUnknown *)pv, riid, FALSE);
}