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 + ];
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 + ];
WCHAR wszRemoteAddress[IPADDRESSLEN + ];
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#中进行自行定义,除了命名其他无需特别注意。

 [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct RAS_CONNECTION_2
{
public IntPtr hConnection;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN)]
public string wszUserName;
public ROUTER_INTERFACE_TYPE dwInterfaceType;
public Guid guid;
public PPP_INFO_2 PppInfo2;
};

对于Win 32结构体中的固定长度的char[]定义,不能使用[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_PORT_NAME)]。字符串数组只能使用UnmanagedType.ByValArray,并指定数组长度大小,即类似这样定义UnmanagedType.ByValArray, SizeConst = MAX_PORT_NAME。如果使用ByBalArray,将会在运行时报错。

“System.TypeLoadException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理

其他信息: 无法封送处理类型为“****”的字段“wszPortName”: 无效的托管/非托管类型组合(String 类型的字段必须与 LPStr、LPWStr、LPTStr、BStr 或 ByValTStr 成对出现)。

在处理字符串数组时,需要明确指定字符的编码方式。需要明确指明为CharSet = CharSet.Unicode,否则会出现字符串的截取不正确。比如出现VPN被解析为V情况,这是因为默认的编码可能为ASCII,而将正常的空解析为了结束符。

另外还以下一些特殊的类型:

Win32 类型 .Net 类型
PBYTE  IntPtr
   
   

参考:

[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函数的一些类型转换的更多相关文章

  1. 在C#中调用Win32函数EnumWindows枚举所有窗口。

    原文 http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html 开发旺旺群发软件,难点及重要技术点分析(一) 一.        ...

  2. 【转载】Sqlserver使用Convert函数进行数据类型转换

    在Sqlserver数据库中,可以使用Convert函数来进行数据类型的转换,如将数字类型decimal转换为字符串nvarchar类型,或者将字符串类型转换为数字类型都可以使用Convert函数来实 ...

  3. C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  4. ca70a_c++_重载函数_实参类型转换

    /*ca70a_c++_重载函数_实参类型转换转换等级,详见P290 编译选择哪个函数版本呢?1.精确匹配2.通过类型提升3.通过标准转换4.通过类类型转换参数匹配和枚举类型重载和const形参 vo ...

  5. [转]C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  6. SQL servcer 时间日期函数、数据类型转换

    1.时间日期函数 2.数据类型转换 3.习题 建立两个表,一个部门表,一个人员表.部门:部门的编号,部门的名称,部门的职责.人员:人员的编号,姓名,年龄,性别,cid所属部门

  7. JS 数据类型转换-转换函数、强制类型转换、利用js变量弱类型转换

    1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型 ...

  8. 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)

     1  多行函数(理解:有多个输入,但仅仅输出1个结果) SQL>select count(*) from emp; COUNT(*) ------------- 14 B 字符函数Lowe ...

  9. C# 中使用win32函数 GetScrollInfo返回false 返回引用全是零的问题

    最近做一个项目要获得ScrollBar的位置,因为.net找不到此类功能,只好用MFC中的函数了,GetScrollPos只返回listview顶部的位置,此时我找到了GetScrollInfo,觉得 ...

随机推荐

  1. - > 动规讲解基础讲解四——矩阵取数

    给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.走过的数的总和作为你的得分,求最大 ...

  2. Hadoop2.0安装之非HA版

    主要步骤跟Hadoop1.0(1.0安装地址)一致,主要在配置这块有更改 安装 下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.6.5 ...

  3. python supervisor进程监控工具的使用

    supervisor —— a process control system 另外一个类似 supervisor的工具,因为supervisor 不兼容python3, !!! Circus Proc ...

  4. 苹果app审核,怎样申请加急审核

    苹果app加急审核,是为开发人员提供的特殊通道. 当线上有重大问题须要解决时,能够提出加急审核申请. 心急的朋友直接点 传送门 那么加急审核的入口在哪里呢 首先打开itunesconnect管理后台 ...

  5. java梳理-反射

    本文属于面试题梳理系列:问题:java反射类的訪问私有方法与普通方法相比,须要多处理什么?  之前梳理类载入的时候,介绍到初始化的时机之中的一个:用java.lang.reflect包的方法对类进行反 ...

  6. 在VM中安装Android4.4连接小米手机 之 安装小米手环APP

    1.下载APP 在能够上网的情况的,搜索 小米手环APP就能够找到下载地址 2.安装APP 进入终端 3.在终端按下图红色区域语句依次输入. 先进入超级用户 找到下载的APP所在的路径 然后进入该路径 ...

  7. 500万url的es 批删除

    bash  循环 算术计算 读写文件 [root@hadoop2 ~]# sh looh.sh1234LIZ1 2 3 4 0 1 2 3 4 5 6 7 8 9 10 0games:x:12:100 ...

  8. innerHTML和createTextNode的区别

    innerHTML的用法 tablerowObject.innerHTML createTextNode的用法 createTextNode(data) 返回新创建的 Text 节点,表示指定的 da ...

  9. web中servletcontext和applicationContext

    参看:http://www.cnblogs.com/isisbenben/p/5594323.html servletContext和ApplicationContext有什么区别 servletCo ...

  10. ios16--自定义控件1

    k控制器: // // XMGViewController.h #import <UIKit/UIKit.h> @interface XMGViewController : UIViewC ...