2017-03-27 4 views
0

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->ErrorCode0 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?

+0

Ihr Problem hat nichts mit COM zu tun, was bei einem [mcve] viel offensichtlicher wäre; Sie übergeben "CerberusErrorDetails" falsch. –

Antwort

2

Ohne ein vollständiges Beispiel ist es schwer zu wissen genau was Sie versuchen zu tun. Aber es scheint, dass Sie die folgende

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

(kein new, Adresse struct im Stack) schreiben möchten und

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

(wieder kein new). Beachten Sie, dass dies wenig mit COM zu tun hat.

+0

Danke, genau das habe ich gesucht. – Alexandru

Verwandte Themen