Welche Werte zurückgeben S_OK oder E_FAIL von c# .net-code?
Ich bin Implementierung einer COM-Schnittstelle, die int-Werte zurückgeben sollte entweder S_OK
oder E_FAIL
. Ich bin ok Rückkehr S_OK
wie bekomme ich diese wieder von einem anderen Anruf (Marschall.QueryInterface), aber wenn ich will, um wieder eine Fehler-Wert, was den tatsächlichen Wert verwende ich für E_FAIL
?
(Es ist so einer grundlegenden Frage, die es schwer eine Antwort darauf zu finden)
Vorausgesetzt, es ist eine bestimmte Zahl definiert, die in der Win32-API, ist es Weg, es zu benutzen in .net-code, ohne Sie zu deklarieren meine eigene Konstante?
Dank!
Update (Antwort unten):
Vielleicht bin ich ein kompletter plonker, aber ich habe Probleme mit diesem. Nach meiner Platform SDK, HRESULT ist eine LANGE, eine 32-bit-Ganzzahl mit Vorzeichen, richtig? Also mögliche Werte zwischen-2.147.483.648 bis 2.147.483.647. Aber 0x80004005 = 2,147,500,037 die > 2,147,483,647. Was gibt!?
Bedeutet dies, wenn ich versuche, dies in meinen code:
const int E_FAIL = 0x80004005;
Bekomme ich einen compiler-Fehler kann Nicht implizit konvertiert Typ 'uint' in 'int'.
Update 2:
Werde ich es zu erklären wie diese:
const int E_FAIL = -2147467259;
weil wenn ich es versuche, so etwas zu tun:
const UInt32 E_FAIL = 0x80004005;
return (Int32)E_FAIL;
Bekomme ich einen compiler-Fehler Konstanten Wert '2147500037' kann umgewandelt werden in ein 'int' (mit 'deaktiviert' syntax überschreiben)
Puh! Wer weiß, wie schwierig es sein würde, zu erklären, ein standard-Wert zurück.... Irgendwo muss es eine Klasse sein lauern, die ich haben sollte wie zurück Win32ReturnCodes.E_
SCHEITERN; ... Seufzer
ULTIMATIVE LÖSUNG:
Ich jetzt tun dies, indem Sie die (massive, aber sehr nützlich) HRESULT enum aus pinvoke.net und hinzufügen zu meiner Lösung. Dann verwenden Sie so etwas wie dieses:
return HRESULT.S_OK;
InformationsquelleAutor der Frage Rory | 2008-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
E_FAIL ist Hex 80004005 in WinError.h
Können Sie die vollständigen WinError.h-Datei hier. Sie müssen nicht installieren, C++, nur um zu sehen, wie die Werte.
UPDATE:
Den signed-und unsigned-Versionen 0 x 80004005 sind nur zwei Darstellungen der gleichen bit-Maske. Wenn Sie einen casting-Fehler verwenden Sie dann den negativen Wert mit Vorzeichen. Wenn gegossen, auf eine nicht unterzeichnete lange wird es die "richtigen" Werte. Testen Sie diese selbst in C#, dann funktioniert es
z.B.
Dieser code
produzieren diese Ausgabe
So, es ist sicher zu verwenden -2147467259 für den Wert von E_FAIL
InformationsquelleAutor der Antwort Binary Worrier
Vom WinError.h für Win32
Antworten zu finden, wie dieses, verwenden Sie die visual studio-Datei-Suche die Suche in den header-Dateien der VC-Include-Verzeichnis des visual studio-Installationsverzeichnis.
InformationsquelleAutor der Antwort Rob Prouse
Verwenden Sie die "deaktiviert" - Schlüsselwort, dies zu tun.
z.B.
InformationsquelleAutor der Antwort Simon Giles
VSConstants tun könnten, Sie wollen Sie wollen:
VSConstants.S_OK Feld
Generic HRESULT für den Erfolg.
Namespace: Microsoft.VisualStudio
Assembly: Microsoft.VisualStudio.Shell.10.0 (in Microsoft.VisualStudio.Shell.10.0.dll)
InformationsquelleAutor der Antwort basiphobe
Ich habe diese verwendet:
Kompromiss zwischen Lesbarkeit (wenn du die hex-codes) und C#'s Beschränkung.
InformationsquelleAutor der Antwort cliffwi
Laden Sie das Plattform-SDK (link)
Ich durchsuchte den code und fanden die folgende im winerror.h
Sollten Sie E_FAIL zurückgegeben, statt den Wert. Einfach winerror.h.
InformationsquelleAutor der Antwort Cédric Guillemette