CComVariant

CComVariant应该是对结构tagVARIANT的封装吧。当定义一个CComVariant变量时,需要对这个变量进行初始化,也就是为了设置这个变量的类型,也就是设置vt为VT_EMPTY。

函数HRESULT VariantInit( VARIANTARG FAR *pvarg );初始化变量VARIANTARG ,实际上就是设置VARIANTARG 结构的vt成员为VT_EMPTY,这个函数并不改变该变量的当前内容。eg:

CComVariant varPropValue;

::VariantInit(&varPropValue);

阅读更多

将BSTR变量赋值给CComVariant变量的疑问

08-07

我写了下面一段代码:rnrn [code=C/C++]rn CComVariant varProgID; rn varProgID.vt = VT_BSTR; rn BSTR bstr = ::SysAllocString(OLESTR("esri3DAnalyst.ControlsSceneOpenDocCommand"));rn varProgID.bstrVal = bstr; rn pFrm->m_tbr.AddItem(varProgID, -1, -1, VARIANT_FALSE, 0, esriCommandStyleIconOnly); rn ::SysFreeString(bstr);rn[/code]rnrn 我将varProgID.bstrVal = bstr; 改为varProgID = bstr; rn结果在运行到varProgID = bstr这句时崩溃了,崩溃的地方是CComVariant的 rnClear函数:rn HRESULT Clear() return ::VariantClear(this); rnrn 我估计是执行operator操作符是运行Clear函数出错了。接着我又写了下面一段代码:rn[code=C/C++]rnCComVariant varProgID; rn varProgID.vt = VT_BSTR; rn BSTR bstr = ::SysAllocString(OLESTR("esri3DAnalyst.ControlsSceneOpenDocCommand"));rn varProgID.bstrVal = bstr; rn pFrm->m_tbr.AddItem(varProgID, -1, -1, VARIANT_FALSE, 0, esriCommandStyleIconOnly); rn ::SysFreeString(bstr);rnrn bstr = ::SysAllocString(OLESTR("esri3DAnalyst.ControlsSceneSceneToolbar"));rn varProgID.bstrVal = bstr;rn pFrm->m_tbr.AddItem(varProgID, -1, -1, VARIANT_FALSE, 0, esriCommandStyleIconOnly); rn ::SysFreeString(bstr);rn[/code]rn rn 结果在运行完上面的代码进入CComVariant的析构函数时执行Clear函数:rn HRESULT Clear() return ::VariantClear(this); rn又崩溃了。rnrn 我把第二个 bstr = ::SysAllocString(OLESTR("esri3DAnalyst.ControlsSceneSceneToolbar"));rn varProgID.bstrVal = bstr;rn 改为varProgID = bstr; 程序好了,运行没有问题,也没有内存泄露。rnrn 请问varProgID.bstrVal = bstr;和varProgID = bstr;有什么区别呢?rn

没有更多推荐了,返回首页