📄 sphelper.h
字号:
if (hr != SPERR_NOT_FOUND)
{
SPDBG_REPORT_ON_FAIL(hr);
}
return hr;
}
inline HRESULT SpGetCategoryFromId(
const WCHAR * pszCategoryId,
ISpObjectTokenCategory ** ppCategory,
BOOL fCreateIfNotExist = FALSE)
{
SPDBG_FUNC("SpGetCategoryFromId");
HRESULT hr;
CComPtr<ISpObjectTokenCategory> cpTokenCategory;
hr = cpTokenCategory.CoCreateInstance(CLSID_SpObjectTokenCategory);
if (SUCCEEDED(hr))
{
hr = cpTokenCategory->SetId(pszCategoryId, fCreateIfNotExist);
}
if (SUCCEEDED(hr))
{
*ppCategory = cpTokenCategory.Detach();
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpGetDefaultTokenIdFromCategoryId(
const WCHAR * pszCategoryId,
WCHAR ** ppszTokenId)
{
SPDBG_FUNC("SpGetDefaultTokenFromCategoryId");
HRESULT hr;
CComPtr<ISpObjectTokenCategory> cpCategory;
hr = SpGetCategoryFromId(pszCategoryId, &cpCategory);
if (SUCCEEDED(hr))
{
hr = cpCategory->GetDefaultTokenId(ppszTokenId);
}
return hr;
}
inline HRESULT SpSetDefaultTokenIdForCategoryId(
const WCHAR * pszCategoryId,
const WCHAR * pszTokenId)
{
SPDBG_FUNC("SpSetDefaultTokenIdForCategoryId");
HRESULT hr;
CComPtr<ISpObjectTokenCategory> cpCategory;
hr = SpGetCategoryFromId(pszCategoryId, &cpCategory);
if (SUCCEEDED(hr))
{
hr = cpCategory->SetDefaultTokenId(pszTokenId);
}
return hr;
}
inline HRESULT SpGetDefaultTokenFromCategoryId(
const WCHAR * pszCategoryId,
ISpObjectToken ** ppToken,
BOOL fCreateCategoryIfNotExist = TRUE)
{
SPDBG_FUNC("SpGetDefaultTokenFromCategoryId");
HRESULT hr;
CComPtr<ISpObjectTokenCategory> cpCategory;
hr = SpGetCategoryFromId(pszCategoryId, &cpCategory, fCreateCategoryIfNotExist);
if (SUCCEEDED(hr))
{
WCHAR * pszTokenId;
hr = cpCategory->GetDefaultTokenId(&pszTokenId);
if (SUCCEEDED(hr))
{
hr = SpGetTokenFromId(pszTokenId, ppToken);
::CoTaskMemFree(pszTokenId);
}
}
return hr;
}
inline HRESULT SpSetDefaultTokenForCategoryId(
const WCHAR * pszCategoryId,
ISpObjectToken * pToken)
{
SPDBG_FUNC("SpSetDefaultTokenForCategoryId");
HRESULT hr;
WCHAR * pszTokenId;
hr = pToken->GetId(&pszTokenId);
if (SUCCEEDED(hr))
{
hr = SpSetDefaultTokenIdForCategoryId(pszCategoryId, pszTokenId);
::CoTaskMemFree(pszTokenId);
}
return hr;
}
inline HRESULT SpSetCommonTokenData(
ISpObjectToken * pToken,
const CLSID * pclsid,
const WCHAR * pszLangIndependentName,
LANGID langid,
const WCHAR * pszLangDependentName,
ISpDataKey ** ppDataKeyAttribs)
{
SPDBG_FUNC("SpSetCommonTokenData");
HRESULT hr = S_OK;
// Set the new token's CLSID (if specified)
if (SUCCEEDED(hr) && pclsid)
{
CSpDynamicString dstrClsid;
hr = StringFromCLSID(*pclsid, &dstrClsid);
if (SUCCEEDED(hr))
{
hr = pToken->SetStringValue(SPTOKENVALUE_CLSID, dstrClsid);
}
}
// Set the token's lang independent name
if (SUCCEEDED(hr) && pszLangIndependentName)
{
hr = pToken->SetStringValue(NULL, pszLangIndependentName);
}
// Set the token's lang dependent name
if (SUCCEEDED(hr) && pszLangDependentName)
{
USES_CONVERSION;
TCHAR szLangId[10];
wsprintf(szLangId, _T("%x"), langid);
hr = pToken->SetStringValue(T2W(szLangId), pszLangDependentName);
}
// Open the attributes key if requested
if (SUCCEEDED(hr) && ppDataKeyAttribs)
{
hr = pToken->CreateKey(L"Attributes", ppDataKeyAttribs);
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpCreateNewToken(
const WCHAR * pszTokenId,
ISpObjectToken ** ppToken)
{
SPDBG_FUNC("SpCreateNewToken");
HRESULT hr;
// Forcefully create the token
hr = SpGetTokenFromId(pszTokenId, ppToken, TRUE);
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpCreateNewToken(
const WCHAR * pszCategoryId,
const WCHAR * pszTokenKeyName,
ISpObjectToken ** ppToken)
{
SPDBG_FUNC("SpCreateNewToken");
HRESULT hr;
// Forcefully create the category
CComPtr<ISpObjectTokenCategory> cpCategory;
hr = SpGetCategoryFromId(pszCategoryId, &cpCategory, TRUE);
// Come up with a token key name if one wasn't specified
CSpDynamicString dstrTokenKeyName;
if (SUCCEEDED(hr))
{
if (pszTokenKeyName == NULL)
{
GUID guidTokenKeyName;
hr = CoCreateGuid(&guidTokenKeyName);
if (SUCCEEDED(hr))
{
hr = StringFromCLSID(guidTokenKeyName, &dstrTokenKeyName);
}
if (SUCCEEDED(hr))
{
pszTokenKeyName = dstrTokenKeyName;
}
}
}
// Build the token id
CSpDynamicString dstrTokenId;
if (SUCCEEDED(hr))
{
dstrTokenId = pszCategoryId;
dstrTokenId.Append2(L"\\Tokens\\", pszTokenKeyName);
}
// Forcefully create the token
if (SUCCEEDED(hr))
{
hr = SpGetTokenFromId(dstrTokenId, ppToken, TRUE);
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpCreateNewTokenEx(
const WCHAR * pszCategoryId,
const WCHAR * pszTokenKeyName,
const CLSID * pclsid,
const WCHAR * pszLangIndependentName,
LANGID langid,
const WCHAR * pszLangDependentName,
ISpObjectToken ** ppToken,
ISpDataKey ** ppDataKeyAttribs)
{
SPDBG_FUNC("SpCreateNewTokenEx");
HRESULT hr;
// Create the new token
hr = SpCreateNewToken(pszCategoryId, pszTokenKeyName, ppToken);
// Now set the extra data
if (SUCCEEDED(hr))
{
hr = SpSetCommonTokenData(
*ppToken,
pclsid,
pszLangIndependentName,
langid,
pszLangDependentName,
ppDataKeyAttribs);
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpCreateNewTokenEx(
const WCHAR * pszTokenId,
const CLSID * pclsid,
const WCHAR * pszLangIndependentName,
LANGID langid,
const WCHAR * pszLangDependentName,
ISpObjectToken ** ppToken,
ISpDataKey ** ppDataKeyAttribs)
{
SPDBG_FUNC("SpCreateNewTokenEx");
HRESULT hr;
// Create the new token
hr = SpCreateNewToken(pszTokenId, ppToken);
// Now set the extra data
if (SUCCEEDED(hr))
{
hr = SpSetCommonTokenData(
*ppToken,
pclsid,
pszLangIndependentName,
langid,
pszLangDependentName,
ppDataKeyAttribs);
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpEnumTokens(
const WCHAR * pszCategoryId,
const WCHAR * pszReqAttribs,
const WCHAR * pszOptAttribs,
IEnumSpObjectTokens ** ppEnum)
{
SPDBG_FUNC("SpEnumTokens");
HRESULT hr = S_OK;
CComPtr<ISpObjectTokenCategory> cpCategory;
hr = SpGetCategoryFromId(pszCategoryId, &cpCategory);
if (SUCCEEDED(hr))
{
hr = cpCategory->EnumTokens(
pszReqAttribs,
pszOptAttribs,
ppEnum);
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
inline HRESULT SpFindBestToken(
const WCHAR * pszCategoryId,
const WCHAR * pszReqAttribs,
const WCHAR * pszOptAttribs,
ISpObjectToken **ppObjectToken)
{
SPDBG_FUNC("SpFindBestToken");
HRESULT hr = S_OK;
const WCHAR *pszVendorPreferred = L"VendorPreferred";
const int ulLenVendorPreferred = wcslen(pszVendorPreferred);
// append VendorPreferred to the end of pszOptAttribs to force this preference
ULONG ulLen = pszOptAttribs ? wcslen(pszOptAttribs) + ulLenVendorPreferred + 1 : ulLenVendorPreferred;
WCHAR *pszOptAttribsVendorPref = (WCHAR*)_alloca((ulLen+1)*sizeof(WCHAR));
if (pszOptAttribsVendorPref)
{
if (pszOptAttribs)
{
wcscpy(pszOptAttribsVendorPref, pszOptAttribs);
wcscat(pszOptAttribsVendorPref, L";");
wcscat(pszOptAttribsVendorPref, pszVendorPreferred);
}
else
{
wcscpy(pszOptAttribsVendorPref, pszVendorPreferred);
}
}
else
{
hr = E_OUTOFMEMORY;
}
CComPtr<IEnumSpObjectTokens> cpEnum;
if (SUCCEEDED(hr))
{
hr = SpEnumTokens(pszCategoryId, pszReqAttribs, pszOptAttribsVendorPref, &cpEnum);
}
if (SUCCEEDED(hr))
{
hr = cpEnum->Next(1, ppObjectToken, NULL);
if (hr == S_FALSE)
{
*ppObjectToken = NULL;
hr = SPERR_NOT_FOUND;
}
}
if (hr != SPERR_NOT_FOUND)
{
SPDBG_REPORT_ON_FAIL(hr);
}
return hr;
}
template<class T>
HRESULT SpCreateObjectFromToken(ISpObjectToken * pToken, T ** ppObject,
IUnknown * pUnkOuter = NULL, DWORD dwClsCtxt = CLSCTX_ALL)
{
SPDBG_FUNC("SpCreateObjectFromToken");
HRESULT hr;
hr = pToken->CreateInstance(pUnkOuter, dwClsCtxt, __uuidof(T), (void **)ppObject);
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
template<class T>
HRESULT SpCreateObjectFromTokenId(const WCHAR * pszTokenId, T ** ppObject,
IUnknown * pUnkOuter = NULL, DWORD dwClsCtxt = CLSCTX_ALL)
{
SPDBG_FUNC("SpCreateObjectFromTokenId");
ISpObjectToken * pToken;
HRESULT hr = SpGetTokenFromId(pszTokenId, &pToken);
if (SUCCEEDED(hr))
{
hr = SpCreateObjectFromToken(pToken, ppObject, pUnkOuter, dwClsCtxt);
pToken->Release();
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
template<class T>
HRESULT SpCreateDefaultObjectFromCategoryId(const WCHAR * pszCategoryId, T ** ppObject,
IUnknown * pUnkOuter = NULL, DWORD dwClsCtxt = CLSCTX_ALL)
{
SPDBG_FUNC("SpCreateObjectFromTokenId");
ISpObjectToken * pToken;
HRESULT hr = SpGetDefaultTokenFromCategoryId(pszCategoryId, &pToken);
if (SUCCEEDED(hr))
{
hr = SpCreateObjectFromToken(pToken, ppObject, pUnkOuter, dwClsCtxt);
pToken->Release();
}
SPDBG_REPORT_ON_FAIL(hr);
return hr;
}
template<class T>
HRESULT SpCreateBestObject(
const WCHAR * pszCategoryId,
const WCHAR * pszReqAttribs,
const WCHAR * pszOptAttribs,
T ** ppObject,
IUnknown * pUnkOuter = NULL,
DWORD dwClsCtxt = CLSCTX_ALL)
{
SPDBG_FUNC("SpCreateBestObject");
HRESULT hr;
CComPtr<ISpObjectToken> cpToken;
hr = SpFindBestToken(pszCategoryId, pszReqAttribs, pszOptAttribs, &cpToken);
if (SUCCEEDED(hr))
{
hr = SpCreateObjectFromToken(cpToken, ppObject, pUnkOuter, dwClsCtxt);
}
if (hr != SPERR_NOT_FOUND)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -