c++关于 函数 get_accName(pChild[i],&bstr);

c++调试
for(int i=0;i {
// if(pChild[i].vt == VT_I4)
// {
HRESULT rt = p2->get_accName(pChild[i],&bstr);
if(bstr)
{
mystr.AppendFormat( L"%s\r\n",bstr);
SysFreeString(bstr);
bstr = NULL;
}
调试显示 pChild[i]中的__vfptr = 0x6ca72940
但是 bstr为无法计算的值这是怎么回事你呢????

哪位大神能给出答案 在下 多谢啦

代码也不全,看不明白都是什么类型。

void GetQQChatData(CChatInf &win_inf)
{ cout<<"GetQQdata"<<endl;
IAccessible * p = NULL,*p2=NULL;
if(!SUCCEEDED(AccessibleObjectFromWindow(win_inf.recvhwnd,OBJID_WINDOW,IID_IAccessible,(void**)&p))) {
return;
}
BSTR bstr = NULL,estr = NULL;
//从LPCWSTR构造
bstr = SysAllocString(L"This is A test");

VARIANT vVal,vNext;
long iChildCount,iTotalRecordCount;
DWORD mykey = 0;

vVal.vt = VT_I4;vVal.lVal=0;
VariantInit(&vNext);
p->get_accChildCount(&iChildCount);
if(!SUCCEEDED(p->accNavigate(NAVDIR_FIRSTCHILD,vVal,&vNext)) && vNext.vt == VT_DISPATCH) {
    p->Release();
    return;
}
if(!SUCCEEDED(vNext.pdispVal->QueryInterface(IID_IAccessible,(void**)&p2))) {
    p->Release();
    p2->Release();
    printf("不支持com组件\n");
    return;
}
p2->get_accChildCount(&iChildCount);

if(iChildCount <= win_inf.recvCount) {
    p2->Release();
    p->Release();
    return;
}
VARIANT * pChild = new VARIANT[iChildCount-win_inf.recvCount];

if(pChild == NULL) {
    p2->Release();
    p->Release();
    return;
}
AccessibleChildren(p2,win_inf.recvCount,iChildCount-win_inf.recvCount,pChild,&iTotalRecordCount);

CString mystr = L"";
p2->
for(int i=0;i<iTotalRecordCount;i++)
{

// if(pChild[i].vt == VT_I4)
// {
HRESULT rt = p2->get_accName(pChild[i],&bstr);
// cout<<"QQdata:"<<(CString)(pChild[i])<<endl;
if(bstr)
{
mystr.AppendFormat( L"%s\r\n",bstr);
SysFreeString(bstr);
bstr = NULL;
}
cout<<"QQdata:"<<(LPCTSTR)mystr<<endl;
/*}*/

}
delete [] pChild;
SysFreeString(bstr);//释放
p2->Release();
p->Release();

/*
// 聊天数据过滤
CAliWangWangBuffer &awwb = win_inf. .awwb;
_T_StringVector content_array;
CString szLastChater;
bool bFirstContent = false;
for (_T_StringVector::size_type i = 0; i != buf_array.size(); ++i)
{
CString &buf = buf_array[i];
if (buf.GetLength() == 1 && buf[0] == 0xA0) {
// 出现此情况,可以认为是新的消息发送账号,
// 未免将聊天账号误当做聊天内容,需要删除
// 上一条聊天记录。
// 一般在群聊中出现
//
if (!content_array.empty()) {
if (i > 0) {
szLastChater = awwb.name;
awwb.name = buf_array[i-1];
}
content_array.pop_back();
}
awwb.time.Empty();
} else {
awwb.backup = buf;
if (awwb.name.IsEmpty()) {
awwb.name = buf;
} else if (awwb.time.IsEmpty()) {
if (buf.Find(':') == -1) {
// 私聊时有时抓到的首条记录并非聊天记录,所以要过滤掉
awwb.name.Empty();
continue;
}
awwb.time = buf;
bFirstContent = true;
} else {
// 解析时间戳,过滤聊天历史记录
int time_interval = 0;
CTimeString ts(TIMEFORMAT_NORMAL);
time_interval = ts.GetTimeInterval(awwb.time.GetString());
if (time_interval == -1) {
ts = CTimeString(TIMEFORMAT_ALIWANGWANG);
time_interval = ts.GetTimeInterval(awwb.time.GetString());
if (time_interval == -1) {
continue;
}
ts.ReFormatTime(awwb.time,TIMEFORMAT_NORMAL);
}

            // 1分钟内,时间戳不会重复出现。那就以当前时间更新时间戳。
            if (bFirstContent) {
                bFirstContent = false;
            } else {
                if (time_interval < 120) {
                    ts.GetCurTime(awwb.time);
                    time_interval = 0;
                }
            }

            if (time_interval >= 120) {
                continue;
            }*/

            // 数据入表
            /*switch (win_inf.WindowTypeSub)
            {
            case Ali_2013_group:
                awwb.content = awwb.time+awwb.space+_T("[")+awwb.name+_T("]: ")+_T("<")+awwb.name+_T(">: ")+buf+_T("\r\n");
                break;
            case Ali_2013_person:
                awwb.content = awwb.time+awwb.space+_T("[")+awwb.name+_T("]: ")+buf+_T("\r\n");
                break;
            default:
                continue;
            }
        content_array.push_back(awwb.content);
        }
        }

}

编译通过,运行出错了?看看rt返回值正确吗?bstr返回名称了吗?

 HRESULT rt = p2->get_accName(pChild[i],&bstr);

void GetQQChatData(CChatInf &win_inf)
{ cout<<"GetQQdata"<<endl;
IAccessible * p = NULL,*p2=NULL;
if(!SUCCEEDED(AccessibleObjectFromWindow(win_inf.recvhwnd,OBJID_WINDOW,IID_IAccessible,(void**)&p))) {
return;
}
BSTR bstr = NULL,estr = NULL;
//从LPCWSTR构造
bstr = SysAllocString(L"This is A test");

VARIANT vVal,vNext;
long iChildCount,iTotalRecordCount;
DWORD mykey = 0;

vVal.vt = VT_I4;vVal.lVal=0;
VariantInit(&vNext);
p->get_accChildCount(&iChildCount);
if(!SUCCEEDED(p->accNavigate(NAVDIR_FIRSTCHILD,vVal,&vNext)) && vNext.vt == VT_DISPATCH) {
p->Release();
return;
}
if(!SUCCEEDED(vNext.pdispVal->QueryInterface(IID_IAccessible,(void**)&p2))) {
p->Release();
p2->Release();
printf("不支持com组件\n");
return;
}
p2->get_accChildCount(&iChildCount);

if(iChildCount <= win_inf.recvCount) {
p2->Release();
p->Release();
return;
}
VARIANT * pChild = new VARIANT[iChildCount-win_inf.recvCount];

if(pChild == NULL) {
p2->Release();
p->Release();
return;
}
AccessibleChildren(p2,win_inf.recvCount,iChildCount-win_inf.recvCount,pChild,&iTotalRecordCount);

CString mystr = L"";
p2->
for(int i=0;i {
// if(pChild[i].vt == VT_I4)
// {
HRESULT rt = p2->get_accName(pChild[i],&bstr);
// cout<<"QQdata:"<<(CString)(pChild[i])<<endl;
if(bstr)
{
mystr.AppendFormat( L"%s\r\n",bstr);
SysFreeString(bstr);
bstr = NULL;
}
cout<<"QQdata:"<<(LPCTSTR)mystr<<endl;
/*}*/

}
delete [] pChild;
SysFreeString(bstr);//释放
p2->Release();
p->Release();
/*
// 聊天数据过滤
CAliWangWangBuffer &awwb = win_inf. .awwb;
_T_StringVector content_array;
CString szLastChater;
bool bFirstContent = false;
for (_T_StringVector::size_type i = 0; i != buf_array.size(); ++i)
{
CString &buf = buf_array[i];
if (buf.GetLength() == 1 && buf[0] == 0xA0) {
// 出现此情况,可以认为是新的消息发送账号,
// 未免将聊天账号误当做聊天内容,需要删除
// 上一条聊天记录。
// 一般在群聊中出现
//
if (!content_array.empty()) {
if (i > 0) {
szLastChater = awwb.name;
awwb.name = buf_array[i-1];
}
content_array.pop_back();
}
awwb.time.Empty();
} else {
awwb.backup = buf;
if (awwb.name.IsEmpty()) {
awwb.name = buf;
} else if (awwb.time.IsEmpty()) {
if (buf.Find(':') == -1) {
// 私聊时有时抓到的首条记录并非聊天记录,所以要过滤掉
awwb.name.Empty();
continue;
}
awwb.time = buf;
bFirstContent = true;
} else {
// 解析时间戳,过滤聊天历史记录
int time_interval = 0;
CTimeString ts(TIMEFORMAT_NORMAL);
time_interval = ts.GetTimeInterval(awwb.time.GetString());
if (time_interval == -1) {
ts = CTimeString(TIMEFORMAT_ALIWANGWANG);
time_interval = ts.GetTimeInterval(awwb.time.GetString());
if (time_interval == -1) {
continue;
}
ts.ReFormatTime(awwb.time,TIMEFORMAT_NORMAL);
}

        // 1分钟内,时间戳不会重复出现。那就以当前时间更新时间戳。
        if (bFirstContent) {
            bFirstContent = false;
        } else {
            if (time_interval < 120) {
                ts.GetCurTime(awwb.time);
                time_interval = 0;
            }
        }

        if (time_interval >= 120) {
            continue;
        }*/

        // 数据入表
        /*switch (win_inf.WindowTypeSub)
        {
        case Ali_2013_group:
            awwb.content = awwb.time+awwb.space+_T("[")+awwb.name+_T("]: ")+_T("<")+awwb.name+_T(">: ")+buf+_T("\r\n");
            break;
        case Ali_2013_person:
            awwb.content = awwb.time+awwb.space+_T("[")+awwb.name+_T("]: ")+buf+_T("\r\n");
            break;
        default:
            continue;
        }
    content_array.push_back(awwb.content);
    }
    }

}

告诉我那里有疑问?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????