将"WTSClient结构从C++;到C#

将"WTSClient结构从C++;到C#,c#,c++,struct,C#,C++,Struct,在过去的几天里,我一直在尝试将这个结构转换为C#,但没有成功。。。 这是我迄今为止的尝试: [StructLayout( LayoutKind.Sequential )] public struct _WTSCLIENT { [MarshalAs( UnmanagedType.LPTStr )] public String ClientName; [MarshalAs( UnmanagedType.LPTStr )] public String Domain

在过去的几天里,我一直在尝试将这个结构转换为C#,但没有成功。。。

这是我迄今为止的尝试:

[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吗#

蒂亚

--


Dag.用于您的
ULONG客户号和C++中的所有其他<代码> ULUN < /Cult> S,您已经使用了C型类型<代码> UTEN<代码>。您对
ULONG
的定义与
uint
的大小不同,这可能是一个错误

也许您可以尝试在C#中使用
ulong
(无符号64位,0到18446744073709551615)。这应该符合标准的微软C++ +代码> ULUN < /COD>定义。


为您的
ULONG ClientBuildNumber和C++中的所有其他<代码> ULUN < /Cult> S,您已经使用了C型类型<代码> UTEN<代码>。您对
ULONG
的定义与
uint
的大小不同,这可能是一个错误

也许您可以尝试在C#中使用
ulong
(无符号64位,0到18446744073709551615)。这应该符合标准的微软C++ +代码> ULUN < /COD>定义。

你可以试试

你可以试试

试试

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

它应该会起作用。它的
Marshal.SizeOf
是“正确”的,32位和64位都是Ansi和Unicode

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

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