我正在开发一个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
);
一些事实:
我猜我的WTSQueryUserToken声明一定有问题,因为它只能在32位Windows上失败,这让我觉得它是一个编组问题。但是,我仍然看不出它可能是什么。
答案 0 :(得分:4)
您的sessionId参数我们定义为c#ulong - 无符号的64位整数,而实际的函数导出期望Win32 ulong - 无符号的32位整数。