2017-03-27 10 views
0

私は構造を定義するCOMオブジェクトを公開するVisual StudioのATLプロジェクトを作成しています。COMから構造体を返す

私は私の*.idlで定義された以下のCOMメソッドがあります。

[id(2)] HRESULT CheckOut([in] CHAR* feature, [in] CHAR* version, [out] CerberusCheckoutDetails* details, [out] CerberusErrorDetails* error); 

マイ*.idlは、この構造を定義しています

[ 
    uuid(527568A1-36A8-467A-82F5-228F7C3AC926), 
    version(1.0) 
] 
typedef struct CerberusErrorDetails { 
    INT ErrorCode; 
    BSTR ErrorMessage; 
} CerberusErrorDetails; 

私の実装では、いくつかの点で、この構造体を返します。

int result = checkout(feature, version, 1, 0, remoteServerName); 
if (result != 0) 
{ 
    error = new CerberusErrorDetails(); 
    error->ErrorCode = result; 
    error->ErrorMessage = _bstr_t(errstring()).Detach(); 
    return result; 
} 

私はこれを次のように呼びます:

CerberusNativeLib::CerberusErrorDetails *error = new CerberusNativeLib::CerberusErrorDetails(); 
if (session->CheckOut(feature, version, details, error) != S_OK) 
      std::wcout << error->ErrorCode << ": " << error->ErrorMessage << std::endl; 

私の問題はerror->ErrorCode0ですが、それは-95error->ErrorMessageは常にNULLである(コードのステップは、私はresult-95であることがわかります)でなければなりませんが、errstring()を返すよう、それが実際のエラーメッセージが含まれているべきであるということです例えば、Error trying to connect.のように塗りつぶされたchar *。何故ですか?私は構造を返すしたい。呼び出し側またはCOMオブジェクト側から特別な方法で割り当てる必要がありますか?誰かがこれを行う方法の例を提供することはできますか?

+0

あなたの問題はCOMとは関係ありません。これは[mcve]ではっきりと分かります。 'CerberusErrorDetails'を間違って渡しています。 –

答えて

2

完全な例がないと、正確にはあなたがしようとしていることは分かりません。しかし、あなたが

CerberusNativeLib::CerberusErrorDetails error; 
if (session->CheckOut(feature, version, details, &error) != S_OK) 

(無new、渡されたスタック上structのアドレス)と

int result = checkout(feature, version, 1, 0, remoteServerName); 
if (result != 0) 
{ 
    error->ErrorCode = result; 
    error->ErrorMessage = _bstr_t(errstring()).Detach(); 
    return result; 
} 

(再び、無new)次のことを書きたいことが表示されます。これはCOMとほとんど関係がないことに注意してください。

+0

ありがとう、これはまさに私が探していたものです。 – Alexandru