2011-04-18 61 views
0

我有一个COM + VB6应用程序,我使用MIDL编译器生成了一个头文件。 头包含了以下定义:如何实现将_Recordset **参数发送给COM +应用程序

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) : error C2664: '_AddressLookup::Gett' : cannot convert parameter 3 from 'ADODB::_RecordsetPtr' to '_Recordset ** ' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

回答

1

此:

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

应该

​​

(在recordset前注意& - 这意味着“采取的地址” - 在智能指针的情况下,你显然是在利用这种意志调用超载operator&(),这会给你存储在智能指针内的接口指针的地址)。

+0

我得到一个异常:AddressLookup.cpp(20):错误C2664: '_AddressLookup :: GETT':不能用 从转换参数3 '_com_ptr_t <_IIID> ::接口**' 到 '_Recordset **' [ _IIID = _com_IIID ] 指向的类型是不相关的;转换需要reinterpret_cast,C风格转换或函数风格转换' – Alan 2011-04-20 09:04:25

+0

@Alan:这不是一个例外,这是一个编译错误。问题与命名空间有关。包含'_Recordset'定义的名称空间是什么? – sharptooth 2011-04-20 10:24:24

相关问题