// @pymethod |PyIKnownFolderManager|RegisterFolder|Defines a new known folder
PyObject *PyIKnownFolderManager::RegisterFolder(PyObject *self, PyObject *args)
{
	IKnownFolderManager *pIKFM = GetI(self);
	if ( pIKFM == NULL )
		return NULL;
	IID kfid;
	PyObject *obdef;
	// @pyparm <o PyIID>|id||GUID used to identify the new known folder
	// @pyparm dict|Definition||Dictionary containing info to be placed in a KNOWNFOLDER_DEFINITION struct
	// @comm <om PyIKnownFolder.GetFolderDefinition> can be used to get a template dictionary
	KNOWNFOLDER_DEFINITION def;
	ZeroMemory(&def, sizeof(def));
	if ( !PyArg_ParseTuple(args, "O&O:RegisterFolder", PyWinObject_AsIID, &kfid, &obdef))
		return NULL;
	if (!PyWinObject_AsKNOWNFOLDER_DEFINITION(obdef, def))
		return NULL;
	HRESULT hr;
	PY_INTERFACE_PRECALL;
	hr = pIKFM->RegisterFolder(kfid, &def);
	PY_INTERFACE_POSTCALL;
	FreeKnownFolderDefinitionFields(&def);
	if ( FAILED(hr) )
		return PyCom_BuildPyException(hr, pIKFM, IID_IKnownFolderManager);
	Py_INCREF(Py_None);
	return Py_None;
}
HRESULT RegisterKnownFolder(REFKNOWNFOLDERID kfid, KNOWNFOLDER_DEFINITION *pkfd)
{
    IKnownFolderManager *pkfm = NULL;
    HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
    if (SUCCEEDED(hr))
    {
        hr = pkfm->RegisterFolder(kfid, pkfd);
        if (SUCCEEDED(hr))
        {
            // to make it easy to clean up everything this sample does, we'll track each added kfid
            AddRegisteredFolderToHistory(kfid);
        }
        else
        {
            wprintf(L"IKnownFolder::RegisterFolder() failed with hr = 0x%x\nMake sure this tool is run as an administrator as that is necessary to regiser a known folder", hr);
        }
        pkfm->Release();
    }

    return hr;
}