如何获取最后一个错误(WSAGetLastError)?

时间:2009-04-19 14:28:09

标签: c# .net winapi error-handling pinvoke

如何从WinAPI调用WSAGetLastError()以获得有效的文本错误?

4 个答案:

答案 0 :(得分:20)

[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 WSAGetLastError();

另外,在pinvoke.net上说:

  

你永远不应该PInvoke到GetLastError。改为调用Marshal.GetLastWin32Error!

System.Runtime.InteropServices.Marshal.GetLastWin32Error()

答案 1 :(得分:7)

WSAGetLastError只是Win32 GetLastError函数的包装器。

如果您正在使用P / Invoke进行操作,则可以将SetLastError参数用于DllImport属性。它告诉.NET导入的函数将调用SetLastError(),并且应该收集该值。

如果导入的函数失败,您可以使用Marshal.GetLastWin32Error()获取上一个错误。或者,您可以throw new Win32Exception(),它会自动使用此值。

如果你没有用P / Invoke做事,那你就不走运了:不能保证最后一个错误值会保留足够长的时间,以便通过多层.NET代码返回它。事实上,我将链接到Adam Nathan:never define a PInvoke signature for GetLastError

答案 2 :(得分:0)

从托管代码调用该函数没有多大意义。它在非托管代码中是有意义的,因为您知道被调用的最后一个Win32函数,因此您知道必须设置最后一个错误的函数。在托管代码中,您不知道调用了哪些函数。

您可以使用P / Invoke来调用该函数;它对你没有任何好处。你想要完成什么?

答案 3 :(得分:-2)

这就是我在网上看到将GetLastError放入C#异常机制的方法,如何再次将其取回...

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());
}

因此定义了ActivateDevice: