2009-04-19 18 views

Antwort

0

Es ist nicht sehr sinnvoll, diese Funktion aus verwaltetem Code aufzurufen. Es macht Sinn in nicht verwaltetem Code, da Sie die genau letzte Win32-Funktion kennen, die aufgerufen wurde, damit Sie wissen, welche Funktion den letzten Fehler gesetzt haben muss. In verwaltetem Code wissen Sie nicht, welche Funktionen aufgerufen wurden.

Sie könnten wahrscheinlich P/Invoke verwenden, um die Funktion aufzurufen; Es würde dir einfach nicht gut tun. Was versuchst du zu erreichen?

7

WSAGetLastError ist nur ein Wrapper für die Win32 GetLastError Funktion. Wenn Sie mit P/Invoke arbeiten, können Sie den Parameter SetLastError für das Attribut DllImport verwenden. Es teilt .NET mit, dass die importierte Funktion SetLastError() aufruft und dass der Wert gesammelt werden soll. Wenn die importierte Funktion fehlschlägt, können Sie den letzten Fehler mit Marshal.GetLastWin32Error() erhalten. Alternativ können Sie auch nur throw new Win32Exception(), die diesen Wert automatisch verwendet.

Wenn Sie nichts mit P/Invoke machen, haben Sie kein Glück: Es gibt keine Garantie, dass der letzte Fehlerwert lange genug erhalten bleibt, um ihn durch mehrere Ebenen von .NET-Code zurückzuverwandeln. In der Tat werde ich Adam Nathan verlinken: never define a PInvoke signature for GetLastError.

-2

Dies ist, wie ich im Internet gesehen GetLastError in die C# Ausnahme stellen mechanismand wie man es bekommt wieder heraus ...

try 
{ 
    // some p/invoke call that is going to fail with a windows error ... 
    mHndActivatedDevice = MyNameSpace.Interop.Device.Device.ActivateDevice(
     "Drivers\\BuiltIn\\SomeDriverName", IntPtr.Zero, 0, IntPtr.Zero); 
} 
catch(System.ComponentModel.Win32Exception exc) // as suggested by John Saunders 
{ 
    // you can get the last error like this: 
    int lastError = System.Runtime.InteropServices.Marshal.GetLastWin32Error(); 
    Console.WriteLine("error:" + lastError.ToString()); 

    // but it is also inside the exception, you can get it like this 
    Console.WriteLine(exc.NativeErrorCode.ToString()); 

    Console.WriteLine(exc.ToString()); 
} 

wo ActivateDevice so definiert ist:

+1

-1: Der Code sollte Win32Exception, nicht Exception fangen. Andernfalls besteht die Möglichkeit, dass ein anderer Ausnahmetyp abgefangen wird, und der Fall von Win32Exception schlägt fehl. –

Verwandte Themen