将_WTSClient结构从 C++ 转换为 C#

本文关键字:转换 C++ WTSClient 结构 | 更新日期: 2023-09-27 18:35:34

在过去的几天里,我一直在尝试将此结构转换为 C#,但无济于事......https://msdn.microsoft.com/en-us/library/windows/desktop/bb736369(v=vs.85).aspx

typedef struct _WTSCLIENT {
  TCHAR  ClientName[CLIENTNAME_LENGTH + 1];
  TCHAR  Domain[DOMAIN_LENGTH + 1 ];
  TCHAR  UserName[USERNAME_LENGTH + 1];
  TCHAR  WorkDirectory[MAX_PATH + 1];
  TCHAR  InitialProgram[MAX_PATH + 1];
  BYTE   EncryptionLevel;
  ULONG  ClientAddressFamily;
  USHORT ClientAddress[CLIENTADDRESS_LENGTH + 1];
  USHORT HRes;
  USHORT VRes;
  USHORT ColorDepth;
  TCHAR  ClientDirectory[MAX_PATH + 1];
  ULONG  ClientBuildNumber;
  ULONG  ClientHardwareId;
  USHORT ClientProductId;
  USHORT OutBufCountHost;
  USHORT OutBufCountClient;
  USHORT OutBufLength;
  TCHAR  DeviceId[MAX_PATH + 1];
} WTSCLIENT, *PWTSCLIENT;

这是我到目前为止的尝试:

[StructLayout( LayoutKind.Sequential )]
public struct _WTSCLIENT {
    [MarshalAs( UnmanagedType.LPTStr )]
    public String ClientName;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String Domain;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String UserName;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String WorkDirectory;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String InitialProgram;
    public Byte EncryptionLevel;
    public uint ClientAddressFamily;
    [MarshalAsAttribute( UnmanagedType.ByValArray)]
    public byte[] ClientAddress;
    public ushort HRes;
    public ushort VRes;
    public ushort ColorDepth;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String ClientDirectory;
    public uint ClientBuildNumber;
    public uint ClientHardwareId;
    public ushort ClientProductId;
    public ushort OutBufCountHost;
    public ushort OutBufCountClient;
    public ushort OutBufLength;
    [MarshalAs( UnmanagedType.LPTStr )]
    public String DeviceId;
}

我是这样使用它的:

WTSQuerySessionInformation( serverHandle, si.SessionID, WTS_INFO_CLASS.WTSClientInfo, out clientInfoPtr, out bytes );
clientInfo = (_WTSCLIENT)Marshal.PtrToStructure( clientInfoPtr, typeof( _WTSCLIENT ) );

。但它无声无息地爆炸出来,所以显然我没有匹配结构......

任何人都可以帮助我将结构转换为 C#

啪......

--

达格。

将_WTSClient结构从 C++ 转换为 C#

尝试

[StructLayout(LayoutKind.Sequential)]
public struct WTSCLIENT
{
    private const int CLIENTNAME_LENGTH = 20;
    private const int DOMAIN_LENGTH = 17;
    private const int USERNAME_LENGTH = 20;
    private const int MAX_PATH = 260;
    private const int CLIENTADDRESS_LENGTH = 30;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CLIENTNAME_LENGTH + 1)]
    public string ClientName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = DOMAIN_LENGTH + 1)]
    public string Domain;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = USERNAME_LENGTH + 1)]
    public string UserName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)]
    public string WorkDirectory;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)]
    public string InitialProgram;
    public byte EncryptionLevel;
    public uint ClientAddressFamily;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = CLIENTADDRESS_LENGTH + 1)]
    public ushort[] ClientAddress;
    public ushort HRes;
    public ushort VRes;
    public ushort ColorDepth;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)]
    public string ClientDirectory;
    public uint ClientBuildNumber;
    public uint ClientHardwareId;
    public ushort ClientProductId;
    public ushort OutBufCountHost;
    public ushort OutBufCountClient;
    public ushort OutBufLength;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)]
    public string DeviceId;
}

它应该有效。它的Marshal.SizeOf是"正确"的,包括 32 位和 64 位,包括 Ansi 和 Unicode。

如果您使用的是 Unicode 版本的方法,请将第一行更改为:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

您可以尝试使用 P/Invoke Interop Assistant

对于ULONG ClientBuildNumber;和C++中的所有其他ULONG,您使用了 C# 类型 uint 。您对ULONG的定义与uint 的大小不同,这可能是一个错误。

也许您可以尝试在 C# 中使用 ulong(无符号 64 位,0 到 18,446,744,073,709,551,615)。这应该符合标准Microsoft C++ ULONG定义。

MSDN C++

MSDN C# ulong