COM (HRESULT) -> C# Fehlerbehandlung



  • Hallo.

    ich habe eine Datenbank basierend auf einem COM-Server programmiert.
    es gibt beispielsweise folgende funktion

    HRESULT insert([in] LONG clientId, [in] BSTR command);

    die funktion gibt einen HRESULT zurück, der für die Fehlerbehandlung verwendet wird.

    nun möchte ich diese Datenbank in C# ansprechen. wird der datenbankserver als objekt eingebunden, dann sieht der nun etwa so aus:

    void ICOMMyDB.insert(int clientId, string command);

    also kein Rückgabewert mehr, der zur Fehlerbehandlung verwendet werden kann.
    ich habe gehört, dass man die HRESULTs automatisch als Exceptions alla
    try.. catch zur Verfügung hat.

    wie sieht der sourcecode dafür aus?

    danke
    gruß
    edi



  • try
    {
      db.insert(id,cmd);
    }
    catch(Exception e)
    {
       // error, siehe doku zu Exception für mehr info
    }
    


  • hallo,

    ich hab das hier mal versucht:

    try
    			{
    				if(this.clientId == 0) db.insert(clientId, commandLine);
    			}
    			catch(Exception e)
    			{
    				MessageBox.Show("Error: " + e.Message);
    			}
    

    Klappt aber leider nicht. ich hab das gefühl, dass ich dem System erst sagen muss, dass der HRESULT aus dem cpp überhaupt eine exception ist.



  • Das weiss das System schon, ist so in den COM-Regeln festelegt. Lieferst du ein HRESULT mit severity Error wird eine COMException geworfen (ist von Exception abgeleitet, also solltest du auch in deinem catch landen).

    Welchen error code liefert denn dein COM-Server?



  • Hallo.

    Unter anderem S_OK, S_FALSE, ERROR_NOT_LOGGED_ON, ERROR_FILE_NOT_FOUND und diese beiden hier:

    // selbstdefinierte HRESULT Konstanten
    #define SYNTAX_ERROR ((HRESULT)0xFF01L)
    #define NUM_OF_ARGUMENTS_ERROR ((HRESULT)0xFF02L)



  • Das sind keine HRESULTs 😉
    HRESULT hat einen fest definierten aufbau, siehe http://msdn2.microsoft.com/en-us/library/ms690088.aspx
    Bit 31 ist das severity bit und gibt an ob es ein success oder failure code ist.
    ERROR_NOT_LOGGED_ON und ERROR_FILE_NOT_FOUND ist als HRESULT also ein success codes, genau so wie deine und S_FALSE (das S_ steht für success). Das gegenstück von S_OK ist E_FAIL nicht S_FALSE 😉

    Wenn du dir error codes selbst definieren willst kannst du das MAKE_HRESULT makro verwenden. Bsp:

    #define MY_COM_ERROR_CODE MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,1001)
    #define MY_COM_OK_CODE MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_ITF,1001)
    

    Um windows error codes wie ERROR_FILE_NOT_FOUND in ein HRESULT zu packen gibt es HRESULT_FROM_WIN32



  • Vielen Dank für die Info. Als Neueinsteiger ist es vermutlich fast unmöglich, ALLES notwendige aus der MSDN herauszufinden:)

    in der winerror.h steht das etwas anders als im link in deinem post:

    // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    // +---+-+-+-----------------------+-------------------------------+
    // |Sev|C|R| Facility | Code |
    // +---+-+-+-----------------------+-------------------------------+

    // Sev - is the severity code
    //
    // 00 - Success
    // 01 - Informational
    // 10 - Warning
    // 11 - Error

    anscheinend sind die obersten beiden bits die severity bits.

    wo liegt der unterschied zwischen den windows error codes und den oben genannten?



  • Das R-bit ist der unterschied, windows verwendet es um den severity code zu erweitern. Bei COM ist das bit reserved, weshalb es hier auch kein Informational und Warning sondern nur Success und Error gibt.

    Wenn du dir die winerror.h etwas genauer ansiehst, sieht du dass es hier 2 typen von error codes gibts. Die 'normalen' windows error codes wie:

    #define ERROR_NOT_LOGGED_ON              1245L
    #define ERROR_FILE_NOT_FOUND             2L
    

    und die HRESULT-basierenden wie:

    #define E_FAIL                           _HRESULT_TYPEDEF_(0x80004005L)
    

    Wenn du ERROR_NOT_LOGGED_ON einfach nach HREAULT castest kommt also ein success code, kein error code raus.


Anmelden zum Antworten