C# 将Windows数据类型映射到.NET
我刚刚浏览了列表,试图找出每种类型如何映射到其等效的.NET类型 我注意到一些类型定义被#if标记包围,它会根据平台更改它们的定义 例如,C# 将Windows数据类型映射到.NET,c#,c++,.net,winapi,types,C#,C++,.net,Winapi,Types,我刚刚浏览了列表,试图找出每种类型如何映射到其等效的.NET类型 我注意到一些类型定义被#if标记包围,它会根据平台更改它们的定义 例如,INT\u PTR #if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR; #endif 我的理解是,这在64位机器上创建了64位INT_PTR,在32位机器上创建了32位INT_PTR。好的……NET在这方面做了相同的事情,因为IntPtr和UIntPtr是特
INT\u PTR
#if defined(_WIN64)
typedef __int64 INT_PTR;
#else
typedef int INT_PTR;
#endif
我的理解是,这在64位机器上创建了64位INT_PTR
,在32位机器上创建了32位INT_PTR
。好的……NET在这方面做了相同的事情,因为IntPtr
和UIntPtr
是特定于平台的,因此可以在32位和64位机器之间进行调整
现在,让我们考虑<代码> LONGLONG <代码> < /P>
#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif
所以在.NET中,我的假设是这映射到Int64
(long
)
也可考虑<代码> TCHAR
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
我在这里的假设是这个映射到char(因为.NET的char是unicode)
问题:
BOOL
和Boolean
之间的差异。.NETBoolean
数据类型(C#bool
)的默认封送处理将其作为32位整数封送,以匹配Windowsbool
类型。WindowsBoolean
数据类型为一个字节。如果要将C#bool
传递给WindowsBoolean
,则必须指定自定义封送处理
结构打包可能会让您绊倒,封送数组可能非常棘手,尤其是结构内部的数组
你一定要仔细阅读。你需要这个做什么?对于原生互操作,有一个P/Unjk,它也可以自己损坏类型(例如,使用<代码>字符串< /C> >,它被损坏成一个<代码> WCARAYT*<代码>)。@作为一个更大项目的一部分,创建一个实用工具,在这里我可以将C++实现(函数/Stutt)输入到文本框中,并生成它的C等价物。我知道这样的工具已经存在,但它们似乎都漏掉了一些东西……特别是关于IN,它应该映射到[IN],但这些似乎在许多转换器中被忽略了
TCHAR
是Windows 95的一个遗留问题,您今天可以放心地忽略它。