2022年用Visual_C#调用Windows_API函数推荐 .pdf
《2022年用Visual_C#调用Windows_API函数推荐 .pdf》由会员分享,可在线阅读,更多相关《2022年用Visual_C#调用Windows_API函数推荐 .pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Api 函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API 函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口,也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样也能够调用动态链接库的API 函数。.NET 框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括 操作系统 提供的 Windows API 函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。下面以 C#为例简单介绍
2、调用API 的基本过程:动态链接库函数的声明动态链接库函数使用前必须声明,相对于 VB,C#函数声明显得更加罗嗦,前者通过 Api Viewer 粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。譬如,你想调用User32.DLL中的MessageBox 函数,我们必须指明函数的名字MessageBoxA 或MessageBoxW,以及库名字User32.dll,我们知道 Win32 API 对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI 版本和双字节字符的UNICODE
3、 版本。下面是一个调用API 函数的例子:DllImport(KERNEL32.DLL,EntryPoint=MoveFileW,SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)public static extern bool MoveFile(String src,String dst);其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函
4、数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI 和 Unicode 版本的调用。CharSet 用于标识函数调用所采用的是Unicode 或是ANSI 版本,ExactSpellingfalse将告诉编译器,让编译器决定使用Unicode 或者是 Ansi 版本。其它的参数请参考 MSDN 在线帮助.在 C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如
5、果在方法定义中使用的函数名与 DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,你必须使用下列属性格式指示一个名字和序号。DllImport(dllname,EntryPoint=Functionname)DllImport(dllname,EntryPoint=#123)值得注意的是,你必须在数字序号前加“”下面是一个用MsgBox替换 MessageBox名字的例子:C#using System.Runtime.InteropServices;public class Win32 DllImport(user32.dll,EntryPoint=MessageBox)pu
6、blic static extern int MsgBox(int hWnd,String text,String caption,uint type);名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 5 页 -许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用StructLayoutAttribute说明的结
7、构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:布局选项描述LayoutKind.Automatic 为了提高效率允许运行态对类型成员重新排序。注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。LayoutKind.Explicit 对每个域按照FieldOffset属性对类型成员排序LayoutKind.Sequential 对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。传递结构成员下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll库中的PtInRect函数,函数的不受管辖原型声明如下:BOOL Pt
8、InRect(const RECT*lprc,POINT pt);注意你必须通过引用传递Rect 结构参数,因为函数需要一个Rect 的结构指针。C#using System.Runtime.InteropServices;StructLayout(LayoutKind.Sequential)public struct Point public int x;public int y;StructLayout(LayoutKind.Explicit public struct Rect FieldOffset(0)public int left;FieldOffset(4)public int
9、top;FieldOffset(8)public int right;FieldOffset(12)public int bottom;class Win32API DllImport(User32.dll)public static extern Bool PtInRect(ref Rect r,Point p);名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 5 页 -类似你可以调用GetSystemInfo函数获得系统信息:?using System.Runtime.InteropServices;StructLayout(LayoutKind.Sequential)pub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年用Visual_C#调用Windows_API函数推荐 2022 年用 Visual_C 调用 Windows_API 函数 推荐
限制150内