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