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

时间: 2024-07-28 19:45:01

C#使用Win32函数的一些类型转换的相关文章

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

好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------------------------------------------------------------------- C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封

字符串函数、数据类型转换函数、连接查询

1.字符串函数 --将身高的平均值转化为asc码 select ASCII(AVG(shengao))from sg --将体重的最大值转化为字符型 select CHAR (MAX(tizhong))from sg --返回一个字符串的四位soundex码 select SOUNDEX ('lskd') --比较两个soundex码有几位相同 select DIFFERENCE ('dgghsf','dfs') --打印空格 select SPACE (11) select 'a'+SPACE

字符串函数和数据类型转换函数

--字符串函数.返回字符串最左侧的字母的asii码print ascii('abcde')print ascii(' ')print char(97)--ascii码和字符之间的转换--*charindex查找字符串中对应字符段的开始索引,索引从1开始print charindex('de','abcdefg')--concat字符串链接print'abc'+'de'--select SOUNDEX('hello')select SOUNDEX('hell')select soundex('he

字符串函数,数据类型转换,链接查询,纵向查询

字符串函数:(*=重点)        ascii:      是一种编码,将键盘上的键变成一个数字,比如回车键=13,但是只能把第一位改变        char :      将数字转换为ascii码***  charindex    查找字符串中对应字符段的开始索引,索引从一开始(12版内置函数) concat:     返回作为串联两个或者更多字符串值的结果的字符串       difference   比较soundex的相似度       soundex:    返回一个由四位字母转

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

1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number). 在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串.parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,该方法将返回NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法

0831 数据库建立,增删改查,各种函数类型,类型转换,模糊查询,排序

create database lian0831gouse lian0831gocreate table stu(code int not null,cid varchar(20) not null,name varchar(10), banji varchar(10),sex varchar(10),age int not null,yufen decimal(18,2),shufen decimal(18,2),yingfen decimal(18,2),)insert into stu v

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

最近做一个项目要获得ScrollBar的位置,因为.net找不到此类功能,只好用MFC中的函数了,GetScrollPos只返回listview顶部的位置,此时我找到了GetScrollInfo,觉得此函甚好.不成想从网上找到示例代码后,函数执行成功了,但是返回了false,查下msdn,说是没取到信息,然后我又用GetLastError想查看下错误信息,但是返回0,就是没有错误,这就纳闷了. 后来又在网上不停的找,找到pinvoke这个网站,这有比较正规的调用例子http://www.pinv

数据库之函数、数据类型转换

一.数学函数 select degree ,sqrt(degree) from score --开平方,平方根 select price, ceiling(Price) from car -- 取大于当前小数的最小整数 select price, floor(Price) from car -- 取小于当前小数的最大整数 select price, round(Price,-1) from car -- 四舍五入,保留几位 select ABS(-2) -- 取绝对值 select RAND()

数据库基础(字符串函数、时间日期函数、数据类型转换、函数转换)

字符串函数: 时间日期函数: 数据转换.函数转换: 练习:查看名字,生日