用visual_c#调用windows_api函数

用visual_c#调用windows_api函数

ID:15111352

大小:37.00 KB

页数:5页

时间:2018-08-01

用visual_c#调用windows_api函数_第1页
用visual_c#调用windows_api函数_第2页
用visual_c#调用windows_api函数_第3页
用visual_c#调用windows_api函数_第4页
用visual_c#调用windows_api函数_第5页
资源描述:

《用visual_c#调用windows_api函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了WindowsAPI函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口,也就是说具备调用动态连接库的能力。VisualC#和其它开发工具一样也能够调用动态链接库的API函数。.NET框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括操作系统提供的WindowsAPI函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。下面以C#为例简单介绍调用API的

2、基本过程:动态链接库函数的声明 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过ApiViewer粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。 动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。 譬如,你想调用User32.DLL中的MessageBox函数,我们必须指明函数的名字MessageBoxA或MessageBoxW,以及库名字User32.dll,我们知道Win32API对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI版本和双字节字符的UNICODE版本。 下面是一

3、个调用API函数的例子:[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW",SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]publicstaticexternboolMoveFile(Stringsrc,Stringdst); 其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。

4、而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助. 在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义

5、中使用的函数名与DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,你必须使用下列属性格式指示一个名字和序号。[DllImport("dllname",EntryPoint="Functionname")][DllImport("dllname",EntryPoint="#123")]值得注意的是,你必须在数字序号前加“#”下面是一个用MsgBox替换MessageBox名字的例子:[C#]usingSystem.Runtime.InteropServices;publicclassWin32{[DllImport("user32.dll",EntryPoint=

6、"MessageBox")]publicstaticexternintMsgBox(inthWnd,Stringtext,Stringcaption,uinttype);}许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用说明的结构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:布局选项描述

7、LayoutKind.Automatic为了提高效率允许运行态对类型成员重新排序。注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。LayoutKind.Explicit对每个域按照FieldOffset属性对类型成员排序LayoutKind.Sequential对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。传递结构成员下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll库中的PtInRect函数,函数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。