C#调用Windows API之参数类型是什么样子的呢?

C#调用Windows API之参数类型1、
数值型直接用对应的就可。
(DWORD -> int , WORD -> Int16)
C#调用Windows API之参数类型2、
API中字符串指针类型 -> .net中string
C#调用Windows API之参数类型3、
API中句柄 (dWord) -> .net中IntPtr
C#调用Windows API之参数类型4、
API中结构 -> .net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类
公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用LayoutKind值初始化 StructLayoutAttribute 类的新实例。 LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。
LayoutKind.Explicit 用于控制每个数据成员的精确位置。利用 Explicit, 每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。如:
- [StructLayout(LayoutKind.Explicit,
 - Size=16, CharSet=CharSet.Ansi)]
 - public class MySystemTime
 - {
 - [FieldOffset(0)]public ushort wYear;
 - [FieldOffset(2)]public ushort wMonth;
 - [FieldOffset(4)]public ushort wDayOfWeek;
 - [FieldOffset(6)]public ushort wDay;
 - [FieldOffset(8)]public ushort wHour;
 - [FieldOffset(10)]public ushort wMinute;
 - [FieldOffset(12)]public ushort wSecond;
 - [FieldOffset(14)]public ushort wMilliseconds;
 - }
 
C#调用Windows API之参数类型实例说明:
下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:
- /**********************************************
 - * API中定义原结构声明
 - * OSVERSIONINFOA STRUCT
 - * dwOSVersionInfoSize DWORD ?
 - * dwMajorVersion DWORD ?
 - * dwMinorVersion DWORD ?
 - * dwBuildNumber DWORD ?
 - * dwPlatformId DWORD ?
 - * szCSDVersion BYTE 128 dup (?)
 - * OSVERSIONINFOA ENDS
 - *
 - * OSVERSIONINFO equ
 - *********************************************/
 - //.net中声明为类
 - [ StructLayout( LayoutKind.Sequential )]
 - public class OSVersionInfo
 - {
 - public int OSVersionInfoSize;
 - public int majorVersion;
 - public int minorVersion;
 - public int buildNumber;
 - public int platformId;
 - [ MarshalAs( UnmanagedType.ByValTStr,
 - SizeConst=128 )]
 - public String versionString;
 - }
 - //或者
 - //.net中声明为结构
 - [ StructLayout( LayoutKind.Sequential )]
 - public struct OSVersionInfo2
 - {
 - public int OSVersionInfoSize;
 - public int majorVersion;
 - public int minorVersion;
 - public int buildNumber;
 - public int platformId;
 - [ MarshalAs( UnmanagedType.ByValTStr,
 - SizeConst=128 )]
 - public String versionString;
 - }
 
此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给 Windows API 函数的字符串 (LPStr):
- [MarshalAs(UnmanagedType.LPStr)]
 - String existingfile;
 - [MarshalAs(UnmanagedType.LPStr)]
 - String newfile;
 
C#调用Windows API之参数类型注意事项:
注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。
- [ DllImport( "kernel32",
 - EntryPoint="GetVersionEx" )]
 - public static extern bool
 - GetVersionEx2( ref OSVersionInfo2 osvi );
 
C#调用Windows API之参数类型基本的情况就是这样子的,希望通过介绍对你了解和学习C#调用Windows API之参数类型有所帮助。
                网站名称:C#调用WindowsAPI之参数类型浅析
                
                网站链接:http://www.csdahua.cn/qtweb/news8/440858.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网