Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Windows数据类型映射到.NET_C#_C++_.net_Winapi_Types - Fatal编程技术网

C# 将Windows数据类型映射到.NET

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是特

我刚刚浏览了列表,试图找出每种类型如何映射到其等效的.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
是特定于平台的,因此可以在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)

问题:

  • 如果本机类型依赖于平台,那么它的.NET等效项是否应该是两个定义中较大的一个
  • 映射数据类型时是否存在已知的陷阱
  • 退房

    映射数据类型时存在许多陷阱。例如,Windows数据类型
    BOOL
    Boolean
    之间的差异。.NET
    Boolean
    数据类型(C#
    bool
    )的默认封送处理将其作为32位整数封送,以匹配Windows
    bool
    类型。Windows
    Boolean
    数据类型为一个字节。如果要将C#
    bool
    传递给Windows
    Boolean
    ,则必须指定自定义封送处理

    结构打包可能会让您绊倒,封送数组可能非常棘手,尤其是结构内部的数组


    你一定要仔细阅读。

    你需要这个做什么?对于原生互操作,有一个P/Unjk,它也可以自己损坏类型(例如,使用<代码>字符串< /C> >,它被损坏成一个<代码> WCARAYT*<代码>)。@作为一个更大项目的一部分,创建一个实用工具,在这里我可以将C++实现(函数/Stutt)输入到文本框中,并生成它的C等价物。我知道这样的工具已经存在,但它们似乎都漏掉了一些东西……特别是关于IN,它应该映射到[IN],但这些似乎在许多转换器中被忽略了
    TCHAR
    是Windows 95的一个遗留问题,您今天可以放心地忽略它。