高级会员
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
|
回复: _variant_t的使用&VC
R:
不是,这是我公司的邮箱,outlook实时在线.
问题在于:
1) 查询接口的时候,不能传智能指针做参数
代码需写成:
IAcadText *pText = NULL;
pEnt->QueryInterface(IID_IAcadText,(void **)&pText);
2) 若要智能指针,可以直接写成 pText = pEnt;
3) 智能指针就不用释放了.
PS:代码修改后,编译通过
bool CSampleWindow::FillTreeWithBlockEntities(HTREEITEM hParent, IAcadBlock *pBlock)
{
CComPtr<IUnknown> pUnk;
CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum;
CComQIPtr<IAcadEntity, &IID_IAcadEntity> pEnt;
CComQIPtr<IAcadText, &IID_IAcadText> pText;///我加的
// IAcadText *pText = NULL;
if (SUCCEEDED(pBlock->get__NewEnum(&pUnk)) && pUnk != NULL)
{
VARIANT varItem;
VariantInit(&varItem);
pNewEnum = pUnk;
while (pNewEnum->Next(1, &varItem, NULL) == S_OK)
{
CComBSTR bName;
/////////////////////
CComBSTR bstring;
////////////////////////////////
assert(VT_DISPATCH == varItem.vt);
pEnt = varItem.pdispVal;
VariantClear(&varItem);
pEnt->get_ObjectName(&bName);
///////////////////////////////////
if(_strcmpi("AcDbText",(LPCSTR)_bstr_t(bName,false))==0)
{
if (!pEnt)
return false;
long nTextCount = 0;
/*
try
{
pEnt->QueryInterface(IID_IAcadText,(void **)&pText);
}
catch(...)
{
} */
pText = pEnt;
if (!pText)
return false;
pText->get_TextString(&bstring);
_variant_t Point;
VariantInit(&Point);
pText->get_InsertionPoint(&Point);
double *pPnt = NULL;
long ind = 0;
SafeArrayAccessData (Point.parray, (void**)&pPnt);
SafeArrayUnaccessData(Point.parray);
// release Point if no use
VariantClear(&Point);
InsertItem(m_wndView, (LPCTSTR)_bstr_t(bstring), 0, 1, 111, hParent, TVI_LAST);
}
}
}
return true;
}
|