2008-12-12 3 views
11

Ich implementiere eine COM-Schnittstelle, die Int-Werte entweder S_OK oder E_FAIL zurückgeben sollte. Ich bin ok, S_OK zurückgeben, wie ich das von einem anderen Aufruf (Marshal.QueryInterface) zurückbekomme, aber wenn ich einen Fehlerwert zurückgeben möchte, welchen tatsächlichen Wert verwende ich für E_FAIL?Welche Werte sollen für S_OK oder E_FAIL von C# .net code zurückgegeben werden?

(Es ist so eine fundamentale Frage, dass es schwer ist, eine Antwort zu finden)

Angenommen, es ist eine bestimmte Anzahl in dem Win32-API definiert ist, ist es so, wie es in .net Code zu verwenden, ohne meine eigene Konstante erklärt ?

danke!

Update (beantwortet unten):

ich sein ein komplettes plonker Mag sein, aber ich habe Probleme mit diesem haben. Laut meinem Platform SDK ist HRESULT ein LONG, eine 32-Bit-Ganzzahl mit Vorzeichen, richtig? So mögliche Werte -2.147.483.648 bis 2.147.483.647. Aber 0x80004005 = 2.147.500.037 was> 2.147.483.647 ist. Was gibt!? Diese

bedeutet, wenn ich versuche, dies in meinem Code zu setzen:

const int E_FAIL = 0x80004005; 

ich ein Compiler-Fehler kann nicht implizit Typ ‚uint‘ auf ‚int‘ konvertieren.

Update 2:

Ich werde es wie folgt erklären:

const int E_FAIL = -2147467259; 

weil, wenn ich versuche, so etwas zu tun:

const UInt32 E_FAIL = 0x80004005; 
return (Int32)E_FAIL; 

ich bekommen Compiler-Fehler Der konstante Wert '2147500037' kann nicht in 'int' konvertiert werden (verwenden Sie die 'unchecked' Syntax zum Überschreiben)

Puh! Wer wusste, wie schwierig es wäre, einen Standard-Rückgabewert zu deklarieren .... Irgendwo muss eine Klasse lauern, die ich hätte verwenden sollen wie return Win32ReturnCodes.E _ FAIL; ... Seufzer

ultimative Lösung:

Ich mache das jetzt durch die (massiv, aber sehr nützlich) bekommen HRESULT Enum von pinvoke.net und Hinzufügen zu meiner Lösung. Dann nutzen Sie es so etwas wie dieses:

return HRESULT.S_OK; 

Antwort

8

E_FAIL ist Hex 80004005 in Winerror.h

Sie die volle WinError.h file here sehen können. Sie müssen C++ nicht installieren, nur um die Werte zu sehen.

UPDATE:

Die signierte und unsignierte Versionen von 0x80004005 sind nur zwei Darstellungen derselben Bit-Maske.Wenn Sie einen Casting-Fehler erhalten, verwenden Sie den negativen Wert mit Vorzeichen. Wenn es an eine lange unterzeichnete UNO gerichtet wird, ist es der "richtige" Wert. Testen Sie dies selbst in C#, es funktioniert z.

Dieser Code

static void Main(string[] args) 
    { 
     UInt32 us = 0x80004005; 
     Int32 s = (Int32)us; 

     Console.WriteLine("Unsigned {0}", us); 
     Console.WriteLine("Signed {0}", s); 
     Console.WriteLine("Signed as unsigned {0}", (UInt32)s); 

     Console.ReadKey(); 
    } 

wird diese Ausgabe

  • Unsigned 2147500037
  • Signed -2147467259
  • als unsigned 2147500037

So verwenden es ist sicher der Unterzeichnung produzieren - 21474 67259 für den Wert von E_FAIL

+0

Dank für all die Hilfe! – Rory

+1

Link gestorben, siehe [Allgemeine HRESULT-Werte hier] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137 (v = vs.85) .aspx) – bland

+0

Ich habe den Link für aktualisiert 'winerror.h', es gibt viele Referenzen da draußen, nur für den Fall, dass die Verbindung wieder bricht, eine sehr einfache Suche wird es bekommen (auch wenn Sie einen C++ - Compiler auf Ihrem Rechner haben, wird es wahrscheinlich ein WinError.h sein datei dort) –

7

Von Winerror.h für Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) 

Um Antworten wie diese zu finden, verwenden Sie visuelle Dateisuche Studio die Header-Dateien in der VC-Include-Verzeichnis Ihrer Visual Studio-Installationsverzeichnis suchen .

C:\Program Files\Microsoft Visual Studio 9.0\VC\include 
-1

Sie sollten die Plattform SDK herunterladen (link)

ich durch den Code gesucht und fanden die folgende in winerror.h

typedef long HRESULT; 

#ifdef RC_INVOKED 
#define _HRESULT_TYPEDEF_(_sc) _sc 
#else // RC_INVOKED 
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc) 
#endif // RC_INVOKED 

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) 
#define S_OK ((HRESULT)0x00000000L) 

Sie sollten E_FAIL zurückgeben anstelle des Wertes. Schließen Sie einfach winerror.h ein.

+0

Er hat seinen Beitrag C# getaggt, deshalb kann er ihn nicht aufnehmen und muss ihn selbst definieren, also die Frage. Dies ist sehr häufig in COM und PInvoke'ing. –

1

Ich habe benutzten:

const int EFail = int.MinValue + 0x00004005; 

zwischen Lesbarkeit beeinträchtigen (wenn Sie den Hex-Codes verwendet sind) und C# 's Beschränkung.

4

Verwenden Sie das "unchecked" -Schlüsselwort, um dies zu tun.

z.B.

const int E_FAIL = unchecked((int)0x80004005); 
2

VSConstants vielleicht wollen Sie Sie wollen:

VSConstants.S_OK Feld

Generisches HRESULT für den Erfolg.

Namespace: Microsoft.VisualStudio

Montage: Microsoft.VisualStudio.Shell.10.0 (in Microsoft.VisualStudio.Shell.10.0.dll)