我正在用 C# 开发一个小型 Windows 服务,它需要在某些时候与 Win32 API 进行互操作。我收到以下对我没有意义的异常:
System.ComponentModel.Win32Exception: The operation completed successfully
在此 C# 代码段的最后一行之后:
var sessionId = Kernel32.WTSGetActiveConsoleSessionId();
var userTokenPtr = new IntPtr();
if (!WtsApi32.WTSQueryUserToken(sessionId, out userTokenPtr))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
这是我在声明WTSQueryUserToken
中的方式WtsApi32
:
[DllImport("Wtsapi32.dll", EntryPoint="WTSQueryUserToken")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSQueryUserToken
(
[In, MarshalAs(UnmanagedType.U8)] ulong sessionId,
[Out] out IntPtr phToken
);
一些事实:
- 这在 64 位 Win7 上完美运行,但在 32 位 Win7 上失败。
- 执行此操作时不可能达到10,000 个句柄限制,这是一个非常小的 Windows 服务中的第一个 Win32 调用。
- 我认为可能存在一些潜在的 Win32 错误,但一些错误用 0 覆盖了错误代码,从而给了我“成功”错误消息,但我不知道如何确认甚至诊断这一点。
- 当我捕捉到异常时,sessionId 为 1,userTokenPtr 为 0。但是,GetLastError 返回 0,所以我不知道发生了什么。
- 我发现这个问题的几乎所有答案都与用户控件的不当处置有关。由于这是一项 Windows 服务,因此并非如此。
我猜我的 WTSQueryUserToken 声明一定有问题,因为它只在 32 位 Windows 上失败,这让我认为这是一个编组问题。但是,我仍然看不到它可能是什么。