Win32 API PInvoke

来源:互联网 发布:php header(location:) 编辑:程序博客网 时间:2024/05/11 21:38

PInvoke什么意思? Platform Invocation Services

 

以下两篇文章阐述了在C#中使用Win32API的细节

 

Visual C#中调用Windows API的要点

http://www.cnblogs.com/showna/articles/869295.html

 

在 C# 中通过 P-Invoke 调用Win32 DLL

http://msdn.microsoft.com/zh-cn/library/aa686045.aspx

 

注意,DllImport必须放在类定义中,一个DllImport对应一个API声明

 

MSDN - Windows API Reference

http://msdn.microsoft.com/en-us/library/aa383749(VS.85).aspx

 

推荐几个辅助.cs文件和工具

 

api.cs (C# API)

http://download.csdn.net/source/511344

 

大量常用Win32 API的C#声明(API函数、结构体和常数声明)

http://www.codefans.net/soft/1880.shtml

 

API精灵 for C#

http://download.csdn.net/source/644635

 

API 常量查询器

http://download.csdn.net/source/967181

 

 一个CHM格式的Windows API参考

http://www.netyi.net/Book/ace90888-7659-476f-be89-b22fc0b3919f.htm

 

推荐使用第一个api.cs,并逐步完善它

 

在文章结束前找到了一个绝好的站点http://www.pinvoke.net/

pinvoke是一个win32 api for .net wiki 上面有绝大多数api及相关数据结构、常量和枚举的C#和VB.NET定义,还包括了API调用的代码范例,而且pinvoki还提供了一个free的VS插件 PInvoke.net Add-in 通过它可以更方便的在.net开发环境中使用api,唯一的缺撼就是对于api的查询结果中只提供了api声明的定义,相关数据结构、常量和枚举需要单独查询,出得的结果也只是相关的pinvoke.net链接。

 

当然pinvoke.net也不是完美的,由于定义由网友提交,因此有些定义并不规范,最常见的就是参数类型的定义可能跟MSDN的时常有些出入,这个问题可以参考:

 

C#中调用Windows API时的数据类型对应关系

http://www.cnblogs.com/madyina/articles/864059.html

 

建议使用在项目中使用一个单独的cs文件存放所有Win32 API的声明及相关定义

 

Win32API.cs

  

  以上代码是从api.cs改进而来,将以上代码复制到VS中,查看效果

1、用四个region块,括起数据类型定义struct、常量定义const、枚举定义enum及API声明

2、为简化代码输入,struct、const、enum定义不放入class api中

3、每个region块与中间内容留出一空行,但最内层的region除外

4、为相关const定义增加region块哪#region MAX_ADAPTER,但struct不需要,因为struct定义本身就具有收缩功能

...

可以维护这样一个cs文件,在项目中使用和完善它,项目结束后单独保存出来

 

 

以下是一个PInvoke.net中关于GetAdapterInfo调用的范例代码的简化版

通过以上代码可以了解一种生疏了的api调用方式(分配堆-调用-根据返回大小重新分配-再调用)、Marshal的使用、非托管内存到托管内存的转换等操作等

 

以下是PInvoke.net中关于GetRasEnumEntries调用的范例代码

以上代码说明了变长数组的api调用方式,以及dwSize,cb,entries的使用

 

最后有一点需要提醒,虽然使用PInvoke可以调用Win32API,但这是需要牺牲一些运行时性能的,所以如果有对应的Managed API的话,还是建议选用Managed API。

 

 

原创粉丝点击