查看单个帖子
旧 2007-05-20, 09:34 AM   #8
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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;

}
yogy离线中   回复时引用此帖