【问题标题】:How do I implement sending a _Recordset ** parameter to a COM+ application如何实现向 COM+ 应用程序发送 _Recordset ** 参数
【发布时间】:2011-08-08 00:42:06
【问题描述】:

我有一个 COM+ VB6 应用程序,我使用 MIDL 编译器生成了一个头文件。 标头包含以下定义:

   virtual /* [id] */ HRESULT STDMETHODCALLTYPE Gett( 
    /* [in] */ BSTR sPostCode,
    /* [in] */ BSTR sSurname,
    /* [retval][out] */ _Recordset **__MIDL_0012) = 0;

在我的 c++ 客户端调用中调用这个 ive 导入

    #import "C:\Program files\Common Files\System\Ado\msado15.dll" 
rename("EOF", "ADOEOF")

GetAddress 函数被调用如下:

void AddressLookup::GetAddress(_bstr_t postCode, _bstr_t address)
{
   ADODB::_RecordsetPtr recordset;
   HRESULT hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));

   m_pIAddressLookup->Gett(postCode, address, recordset);
}

但我不断收到此编译器错误:

AddressLookup.cpp(20):错误 C2664: '_AddressLookup::Gett':不能 将参数 3 从 'ADODB::_RecordsetPtr' 到 '_Recordset ** ' 没有可以执行的用户定义的转换运算符 此转换或运算符 无法调用

【问题讨论】:

    标签: c++ visual-c++ com dcom


    【解决方案1】:

    这个:

    m_pIAddressLookup->Gett(postCode, address, recordset);
    

    应该是

    m_pIAddressLookup->Gett(postCode, address, &recordset);
    

    (注意 &recordset 前面 - 它的意思是“获取地址” - 如果您显然使用智能指针,这将调用重载 operator&(),这将为您提供接口指针存储在智能指针中)。

    【讨论】:

    • 我得到一个异常:AddressLookup.cpp(20) : error C2664: '_AddressLookup::Gett' : 无法将参数 3 从 '_com_ptr_t<_iiid>::Interface ** ' 转换为 '_Recordset * * ' 与 [ _IIID=_com_IIID<:_recordset _guid_00000556_0000_0010_8000_00aa006d2ea4> ] 指向的类型无关;转换需要 reinterpret_cast、C-style cast 或 function-style cast'
    • @Alan:这不是一个例外,这是一个编译错误。问题在于名称空间。包含_Recordset 定义的命名空间是什么?
    猜你喜欢
    • 2018-09-02
    • 2017-08-25
    • 1970-01-01
    • 2011-12-07
    • 2011-04-02
    • 2019-07-22
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多