HRESULT-Informationen in verwaltetem Code
Die Interaktion zwischen verwaltetem Code und COM kann Probleme verursachen, wenn HRESULT-Rückgabewerte aufgetreten sind.
In einer COM-Schnittstelle kann ein HRESULT-Rückgabewert diese Rollen spielen:
Übergeben Sie Fehlerinformationen (beispielsweise E_INVALIDARG).
Übergeben Sie Statusinformationen über ein normales Verhalten des Programms.
Wenn COM-Aufrufe in verwaltetem Code HRESULTs diese Probleme verursachen können:
Funktionen, die COM HRESULT-Werte zurückgeben, die kleiner als Null (Fehler) Code Ausnahmen generieren.
COM-Methoden, die regelmäßig zwei zurückgeben oder verschiedenere Code Erfolgreich oder S_OK z. B. S_FALSE, können nicht definiert.
Da viele des Visual Studio SDK COM entweder Rückhol-HRESULT-Werte kleiner als null rückholcodes Erfolgreich oder andere Funktionen sind die Visual Studio SDK Interop-Assemblys geschrieben worden, damit die Methodensignaturen beibehalten werden. Alle Visual Studio SDK Interop Methoden werden von int-Typ. HRESULT-Werte werden durch die Ebene Interop unverändert übergeben und ohne Ausnahmen zu generieren.
Da die COM-Funktion ein HRESULT an die verwaltete Methode ruft es die aufrufende Methode muss ein HRESULT überprüfen und ggf. Ausnahmen auslösen zurückgibt.
HRESULTs Behandlung von COM an verwalteten Code zurückgegeben wird
Wenn Sie eine COM-Schnittstelle aus verwaltetem Code aufrufen, überprüfen Sie den HRESULT-Wert, und lösen Sie bei Bedarf eine Ausnahme aus. Die ErrorHandler-Klasse enthält die ThrowOnFailure-Methode, die eine COM-Ausnahme auslöst, je nach Wert HRESULTs, das zuvor übergeben wurde.
ThrowOnFailure Standardmäßig löst eine Ausnahme aus, wenn es ein HRESULT übergeben wird, deren Wert kleiner als Null aufweist. In Fällen, in denen eine solche HRESULTs zulässige Werte sind und keine Ausnahme ausgelöst wird, sind die Werte zusätzlicher HRESULTS zu ThrowOnFailure übergeben werden, nachdem die Werte getestet wurden. Ist HRESULT getestete Übereinstimmungen ist, die alle HRESULT-Werte explizit zu ThrowOnFailurehaben, wird keine Ausnahme ausgelöst.
Hinweis
Die VSConstants-Klasse enthält Konstanten für Common HRESULTS, z. B. S_OK und E_NOTIMPLund Visual Studio HRESULTS, z. B.VS_E_INCOMPATIBLEDOCDATA und VS_E_UNSUPPORTEDFORMAT.VSConstants stellt auch die Succeeded und Failed-Methoden, die zur Succeeded-Methode und Failed Makros in COM entsprechen.
Betrachten Sie beispielsweise den folgenden Funktionsaufruf, in dem E_NOTIMPL ein zulässiger Rückgabewert ist, sondern ein anderes HRESULT kleiner als Null einen Fehler darstellt.
Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL);
Wenn es mehr als eine akzeptable Werte vorhanden sind, können zusätzliche HRESULT-Werte in der Liste im Aufruf von ThrowOnFailuregerade angefügt werden.
Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL);
aus verwaltetem Code an COM HRESULTS zurückgeben
Wenn keine Ausnahme auftritt, verwaltete Code zur S_OK zurückgibt, die COM-Funktion. COM-Interop unterstützt allgemeine Ausnahmen, die in verwaltetem Code stark typisiert sind. Zum Beispiel löst eine Methode, die ein unannehmbares null-Argument erhält, ArgumentNullExceptionaus.
Wenn Sie nicht, dass die auszulösende Ausnahme HRESULT Sie jedoch kennen, Sie möchten in COM zurückkehren sicher sind, können Sie die ThrowExceptionForHR-Methode verwenden, um eine entsprechende Ausnahme auszulösen. Dies funktioniert sogar mit einem nicht standardmäßigen Fehler, z. B. VS_E_INCOMPATIBLEDOCDATA ThrowExceptionForHR versucht, ein HRESULT zuordnen, das zuvor auf eine stark typisierte Ausnahme übergeben wird. Wenn dies nicht möglich ist, löst sie eine COM-Ausnahme generische stattdessen aus. Das endgültige Ergebnis ist, dass ein HRESULT, das Sie ThrowExceptionForHR aus verwaltetem Code an die COM-Funktion zurückgegeben werden, die sie aufgerufen wurden.
Hinweis
kompromiss Ausnahme auf Leistung und Reaktionszeit sollen, nicht ordnungsgemäßen Bedingungen Programm anzugeben.Bedingungen, die auftreten, sollten anstelle einer ausgelösten Ausnahme oftmals inline behandelt werden.
Siehe auch
Aufgaben
Gewusst wie: Zuordnen von HRESULTs und Ausnahmen
Konzepte
Erstellen von COM-Komponenten für die Interoperabilität