1

我正在用 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 上失败,这让我认为这是一个编组问题。但是,我仍然看不到它可能是什么。

4

1 回答 1

4

我们将您的 sessionId 参数定义为 ac# ulong - 一个无符号的 64 位整数,而实际的函数导出需要一个 Win32 ulong - 一个无符号的 32 位整数。

c# ulong数据类型

Win32 数据类型

于 2012-07-05T19:04:59.173 回答