现在的位置: 首页 > 综合 > 正文

DLNA 维护笔记

2018年05月08日 ⁄ 综合 ⁄ 共 1778字 ⁄ 字号 评论关闭

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. 

抱歉!评论已关闭.