Ich arbeite an einem ATL-Projekt in Visual Studio, das ein COM-Objekt verfügbar macht, das eine Struktur definiert.Zurückgeben einer Struktur aus COM
Ich habe die folgende COM-Methode definiert in meinem *.idl
:
[id(2)] HRESULT CheckOut([in] CHAR* feature, [in] CHAR* version, [out] CerberusCheckoutDetails* details, [out] CerberusErrorDetails* error);
Meine *.idl
diese Struktur definiert:
[
uuid(527568A1-36A8-467A-82F5-228F7C3AC926),
version(1.0)
]
typedef struct CerberusErrorDetails {
INT ErrorCode;
BSTR ErrorMessage;
} CerberusErrorDetails;
Meine Implementierung gibt diese Struktur an einem gewissen Punkt:
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;
}
Ich nenne es so:
CerberusNativeLib::CerberusErrorDetails *error = new CerberusNativeLib::CerberusErrorDetails();
if (session->CheckOut(feature, version, details, error) != S_OK)
std::wcout << error->ErrorCode << ": " << error->ErrorMessage << std::endl;
Mein Problem ist, dass error->ErrorCode
0
ist, aber es sollte -95
sein (Schreiten durch den Code, kann ich sehen, dass result
ist -95
) und error->ErrorMessage
ist immer NULL
aber es sollte eine tatsächliche Fehlermeldung enthält als errstring()
eine zurück char *
gefüllt, wie Error trying to connect.
. Warum das? Ich möchte eine Struktur zurückgeben. Muss ich es auf eine bestimmte Weise von der aufrufenden Seite oder von der COM-Objektseite zuweisen? Kann jemand bitte ein Beispiel dafür geben, wie man das macht?
Ihr Problem hat nichts mit COM zu tun, was bei einem [mcve] viel offensichtlicher wäre; Sie übergeben "CerberusErrorDetails" falsch. –