2011-04-18 66 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

相關問題