1. VARIANT结构体
_variant_t类实现了对VARIANT结构体的封装,可以避免指针的问题。使用_variant_t时,出现链接错误的解决方法:添加comsupp.lib库。
C#中与其对应的类是object.
2. 今天(2012/8/1)写了段得意的代码:
template<VARTYPE varType>
class MetadataPropertyExtractor{
public:
template<typename PropTy, typename MetadataTy>
HRESULT operator()(PropTy &prop, CComPtr<MetadataTy> pMetadata, const BSTR propName){
HRESULT hr(S_OK);
if(NULL != pMetadata){
VARIANT val;
VERIFYCHECKEDCALL(hr, pMetadata->GetMetadataKeyValue(propName, &val));
if(SUCCEEDED(hr) && varType == val.vt){
prop = _variant_t(val);
return S_OK;
}
}
return S_FALSE;
}
};
template<>
class MetadataPropertyExtractor<VT_BSTR>{
public:
template<typename MetadataTy>
HRESULT operator()(std::wstring &prop, CComPtr<MetadataTy> pMetadata, const BSTR propName){
HRESULT hr(S_OK);
if(NULL != pMetadata){
VARIANT val;
VERIFYCHECKEDCALL(hr, pMetadata->GetMetadataKeyValue(propName, &val));
if(SUCCEEDED(hr) && VT_BSTR == val.vt){
prop = CComUtils::SafeReturnBSTR(val.bstrVal);
return S_OK;
}
}
return S_FALSE;
}
template<typename MetadataTy>
HRESULT operator()(PVDimension &prop, CComPtr<MetadataTy> pMetadata, const BSTR propName){
HRESULT hr(S_OK);
if(NULL != pMetadata){
VARIANT val;
VERIFYCHECKEDCALL(hr, pMetadata->GetMetadataKeyValue(propName, &val));
if(SUCCEEDED(hr) && VT_BSTR == val.vt){
std::wstring strDimmension(CComUtils::SafeReturnBSTR(val.bstrVal));
std::wstringstream(strDimmension.substr(strDimmension.find_first_of(L"W") + 1, strDimmension.find_first_of(L"H"))) >> prop.nWidth;
std::wstringstream(strDimmension.substr(strDimmension.find_first_of(L"H") + 1)) >> prop.nHeight;
return S_OK;
}
}
return S_FALSE;
}
};
3. (2012/08/07)HRESULT返回值S_OK,S_FALSE,E_FAIL。用SUCCEED判断,S_*都成功,E_*失败。区分S_OK和S_FALSE,可以直接进行比较不需要借助宏。
4. (2012/08/08) 怎么提高看代码的速度
之前老是一行一行地看代码,这对小程序来说还可以忍受。但在程序很大的情况下,速度就显得尤为重要。总结下最近看代码的经验:首先,了解函数之间的调用关系,函数名就是注释。这可以在宏观上抓住程序流程。其实,对于单个函数内的代码也要跳着看效率才高。看函数之前,先看函数名,知道它大概干些什么活。在看函数内部代码的时候,以它调用其它函数为中心,向上向下看。
5.