如何从WinAPI调用WSAGetLastError()
以获得有效的文本错误?
答案 0 :(得分:20)
[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 WSAGetLastError();
另外,在pinvoke.net上说:
你永远不应该PInvoke到GetLastError。改为调用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: