将"WTSClient结构从C++;到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
[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)]