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

标签 c# c++ struct

过去几天我一直在尝试将此结构转换为 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#

TIA...

--

达格。

最佳答案

尝试

[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)]

关于c# - 将 _WTSClient 结构从 C++ 转换为 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547873/

相关文章:

java - 有可用的聊天机器人框架吗?

swift - 让或结构与枚举

c# - dotnet 核心授权总是重定向到身份默认登录页面

c# - 如何将 Expression<Func<BaseClass, bool>> 转换为 Expression<Func<InheritedClass, bool>>?

c++ - 转类 "Interfaceable"

c++ - 复制赋值函数如何访问另一个对象的私有(private)成员(Stroustrup 原则与实践书)?

c++ - 无法将 {...} 从 <brace-enclosed initializer list> 转换为 struct

c++ - 成员变量与函数参数

c# - ASP.Net Cookie 未保存到浏览器

c# - WebApi POST 参数始终为空