COM (HRESULT) -> C# Fehlerbehandlung
-
Hallo.
ich habe eine Datenbank basierend auf einem COM-Server programmiert.
es gibt beispielsweise folgende funktionHRESULT 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_FALSEWenn 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 - Erroranscheinend 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.