L’appel de ma méthode COM à partir de C # donne une structure null retournée si HRESULT n’est pas 0

Voici mon code C #:

static void Main(ssortingng[] args) { CrappyCOMService service = new CrappyCOMService(); CrapStructure crapStructure = new CrapStructure(); try { service.TestCrap(1337, "This is bananas.", out crapStructure); } catch (Exception exception) { Console.WriteLine(exception.ToSsortingng()); } Console.WriteLine(crapStructure.ErrorCode); Console.WriteLine(crapStructure.ErrorMessage); } 

Voici mon IDL:

 [ object, uuid(61B0BFF7-E9DF-4D7E-AFE6-49CC67245257), dual, nonextensible, pointer_default(unique) ] interface ICrappyCOMService : IDispatch{ typedef [ uuid(C65F8DE6-EDEF-479C-BD3B-17EC3F9E4A3E), version(1.0) ] struct CrapStructure { INT ErrorCode; BSTR ErrorMessage; } CrapStructure; [id(1)] HRESULT TestCrap([in] INT errorCode, [in] BSTR errorMessage, [out] CrapStructure *crapStructure); }; [ uuid(763B8CA0-16DD-48C8-BB31-3ECD9B9DE441), version(1.0), ] library CrappyCOMLib { importlib("stdole2.tlb"); [ uuid(F7375DA4-2C1E-400D-88F3-FF816BB21177) ] coclass CrappyCOMService { [default] interface ICrappyCOMService; }; }; 

Voici ma mise en œuvre:

 STDMETHODIMP CCrappyCOMService::TestCrap(INT errorCode, BSTR errorMessage, CrapStructure *crapStructure) { memset(crapStructure, 0, sizeof(CrapStructure)); crapStructure->ErrorCode = errorCode; crapStructure->ErrorMessage = errorMessage; return -1; } 

Le problème : lorsque je retourne -1 dans l’implémentation ci-dessus de la méthode TestCrap , il en résulte une exception dans le monde C #. Lorsque cela se produit, crapStructure.ErrorCode est défini sur 0 et crapStructure.ErrorMessage est null , bien qu’il soit clairement défini sur la valeur 1337 et “Ceci est une banane”, respectivement .

La question : Comment puis-je voir les valeurs de crapStructure.ErrorCode et crapStructure.ErrorMessage lorsque TestCrap renvoie -1 ? J’ai vérifié que du code similaire fonctionne parfaitement à partir de C ++ ou si P / Invoking directement à partir de C # au lieu d’utiliser une référence COM sur C #.

De plus : si je retourne S_OK (autrement appelé 0) dans l’implémentation ci-dessus, alors je retourne 1337 et, “Ceci est une banane”, ce à quoi je m’attendrais / voudrais voir même lorsque HRESULT n’est pas à 0.