C#使用Win32函数的一些类型转换

Posted badlands

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#使用Win32函数的一些类型转换相关的知识,希望对你有一定的参考价值。

C#在访问Win 32 Api时需要处理C 结构与C#结构的映射,这在MSDN以及许多Blog上都可以找到参考的资料。Win 32 中有一些定义复杂的Struct,这些结构体拥有长度固定的数组或者一些特殊的结构,比如定义拥有有char Name[ULEN]、GUID、HANDLE等。在Mprapi中有一个名为RAS_CONNECTION_2这样的结构体,它描述了远程连接到服务器【远程与路由访问服务】的连接信息,是一个级联的、复杂的结构体定义。其Win 32的定义如下:

typedef struct _RAS_CONNECTION_2 {
  HANDLE                hConnection;
  WCHAR                 wszUserName[UNLEN + 1];
  ROUTER_INTERFACE_TYPE dwInterfaceType;
  GUID                  guid;
  PPP_INFO_2            PppInfo2;
} RAS_CONNECTION_2, *PRAS_CONNECTION_2;

typedef struct _PPP_INFO_2 {
  PPP_NBFCP_INFO nbf;
  PPP_IPCP_INFO2 ip;
  PPP_IPXCP_INFO ipx;
  PPP_ATCP_INFO  at;
  PPP_CCP_INFO   ccp;
  PPP_LCP_INFO   lcp;
} PPP_INFO_2;

typedef struct _PPP_IPCP_INFO2 {
  DWORD dwError;
  WCHAR wszAddress[IPADDRESSLEN + 1];
  WCHAR wszRemoteAddress[IPADDRESSLEN + 1];
  DWORD dwOptions;
  DWORD dwRemoteOptions;
} PPP_IPCP_INFO2;

上面只只列出了一项层级定义,即RAS_CONNECTION_2 -> PPP_FINO_2 ->PPP_IPCP_INFO2,其他层级类似。在这样一个结构封装定义中,需要涉及到固定长度数组的封送(C++到.Net)、特殊类型定义(HANDLE & GUID)以及结构体包含。在MSDN上[2],找到了以下这些.Net已经封装好的用于交互的特殊类型。

特殊值类型
系统值类类型 IDL类型
System.DateTime DATE
System.Deimal DECIMAL
System.Guid GUID
System.Drawing.Color OLE_COLOR

 

 

 

 

 

 

GUID对应System.Guid。HANDLE不能对应System.Activities.Handle,该类与互调无关。HANDLE一般对应System.IntPtr,见下列代码第一行。固定长度char数组(而不是字符串指针)的定义见第5、6行。第7行的结构体同样需要在C#中进行自行定义,除了命名其他无需特别注意。

 1 [StructLayout(LayoutKind.Sequential)]
 2 public struct RAS_CONNECTION_2
 3 {            
 4         public IntPtr hConnection;
 5         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN)]
 6         public string wszUserName;
 7         public ROUTER_INTERFACE_TYPE dwInterfaceType;
 8         public Guid guid;
 9         public PPP_INFO_2 PppInfo2;
10 };

 

参考:

[1]默认封送处理行为, https://msdn.microsoft.com/zh-cn/library/zah6xy75.aspx

[2]可直复制和不可直接复制类型, https://msdn.microsoft.com/zh-cn/library/75dwhxf7.aspx

[2]数组的默认封送处理——结构内的数组, https://msdn.microsoft.com/zh-cn/library/z6cfh6e6.aspx

以上是关于C#使用Win32函数的一些类型转换的主要内容,如果未能解决你的问题,请参考以下文章

python将文本转换成语音的代码

C#调用Win32 api时的内存操作

从 C# 访问 Win32/MFC “Stuff”

c# 使用 Win32_DiskDrive 对象的内存卡接口类型

c#中怎么将string转换成int型

C++ Win32 中的 C# DateTime.ToUniversalTime() [关闭]