gpt4 book ai didi

c# - "Win32Exception: The operation completed successfully"在 32 位 Windows 上的 WTSQueryUserToken 之后(64 位有效)

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:09 27 4
gpt4 key购买 nike

我正在用 C# 开发一个小型 Windows 服务,它需要在某个时候与 Win32 API 进行互操作。我收到以下对我来说没有意义的异常:

System.ComponentModel.Win32Exception: 操作成功完成

在此 C# 代码段的最后一行之后:

var sessionId = Kernel32.WTSGetActiveConsoleSessionId();
var userTokenPtr = new IntPtr();
if (!WtsApi32.WTSQueryUserToken(sessionId, out userTokenPtr))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}

下面是我在 WtsApi32 中声明 WTSQueryUserToken 的方式:

[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 handle limit执行此操作时已达到,这是非常小的 Windows 服务中的第一个 Win32 调用。
  • 我认为可能存在一些潜在的 Win32 错误,但一些错误用 0 覆盖了错误代码,从而给我“成功”错误消息,但我不知道如何确认甚至诊断这一点。
  • 当我捕捉到异常时,sessionId 为 1,userTokenPtr 为 0。但是,GetLastError 返回 0,所以我不知道发生了什么。
  • 我找到的这个问题的几乎所有答案都与 improper disposal of user controls 有关。 .由于这是一项 Windows 服务,事实并非如此

我猜我的 WTSQueryUserToken 声明一定有问题,因为它只在 32 位 Windows 上失败,这让我认为这是一个编码问题。但是,我仍然看不出它可能是什么。

最佳答案

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

c# ulong data type

Win32 data types

关于c# - "Win32Exception: The operation completed successfully"在 32 位 Windows 上的 WTSQueryUserToken 之后(64 位有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com