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.