例如,在使用CDO的时候,Session有一个方法定义如下:_variant_t GetAddressList (const _variant_t & ObjectType );要将返回结果转换为AddressList, AddressList定义如下:struct __declspec(uuid("3fa7deaf-6438-101b-acc1-00aa00423326"))
AddressList : IDispatch
{
    //
    // Property data
    //
    //...
}
没有用过COM, 望指点迷津,谢谢!

解决方案 »

  1.   

    附上 GetAddressList()返回值:
    VARIANT vRet, vParam;
    VariantInit(&vRet);
    VariantInit(&vParam);V_VT(&vParam) = VT_INT;
    V_INT(&vParam) = 1;
    vRet = session.GetAddressList(vParam);
    // 到这里的时候,vRet.vt == VT_DISPATCH, vRet.pdispVal = 0x02000388;
      

  2.   

    你#import dll之后,它回自动有代码进行转换。大概代码如下(细节需要你自己研究)
    SessionPtr session;
    AddressListPtr al = session->getAddressList();
      

  3.   

    CComPtr<IDispatch> disp = (IDispatch *)session->GetAddressList();
    直接赋值就可以了。
      

  4.   

    OK, 自己搞定,贴出来供参考:MAPI::AddressListPtr pAddrList = pSession->GetAddressList(vObjType);实际上是调用_com_ptr_t的拷贝构造函数
    _com_ptr_t(const _variant_t& varSrc) 
            : m_pInterface(NULL)
        {
            HRESULT hr = QueryStdInterfaces(varSrc);        if (FAILED(hr) && (hr != E_NOINTERFACE)) {
                _com_issue_error(hr);
            }
        }具体内部实现是在QueryStdInterfaces中完成的。
    谢谢阿荣,qiangqiang的关注。结贴,散分。