C#中调用Windows API的要点

710957524

710957524

2016-01-29 13:36

C#中调用Windows API的要点,C#中调用Windows API的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:Program FilesMicrosoft Visual Studio .NETFrameworkSDKSamplesTechnologiesInteropPlatformInvokeWinAPIsCS目录下有大量的调用API的例子。


  一、调用格式

 using System.Runtime.InteropServices; //引用此名称空间,简化后面的代码
  ...
  //使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空。
  [DllImport("user32.dll")]
  public static extern ReturnType FunctionName(type arg1,type arg2,...);
  //调用时与调用其他方法并无区别

  可以使用字段进一步说明特性,用逗号隔开,如:

 [ DllImport( "kernel32", EntryPoint="GetVersionEx" )]

  DllImportAttribute特性的公共字段如下:
  1、CallingConvention 指示向非托管实现传递方法参数时所用的 CallingConvention 值。
  CallingConvention.Cdecl : 调用方清理堆栈。它使您能够调用具有 varargs 的函数。
  CallingConvention.StdCall : 被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。

  2、CharSet 控制调用函数的名称版本及指示如何向方法封送 String 参数。

  此字段被设置为 CharSet 值之一。如果 CharSet 字段设置为 Unicode,则所有字符串参数在传递到非托管实现之前都转换成 Unicode 字符。这还导致向 DLL EntryPoint 的名称中追加字母“W”。如果此字段设置为 Ansi,则字符串将转换成 ANSI 字符串,同时向 DLL EntryPoint 的名称中追加字母“A”。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

  大多数 Win32 API 使用这种追加“W”或“A”的约定。如果 CharSet 设置为 Auto,则这种转换就是与平台有关的(在 Windows NT 上为 Unicode,在 Windows 98 上为 Ansi)。CharSet 的默认值为 Ansi。CharSet 字段也用于确定将从指定的 DLL 导入哪个版本的函数。

  CharSet.Ansi 和 CharSet.Unicode 的名称匹配规则大不相同。对于 Ansi 来说,如果将 EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethod”。如果 DLL 中没有“MyMethod”,但存在“MyMethodA”,则返回“MyMethodA”。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

  对于 Unicode 来说则正好相反。如果将 EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,则返回“MyMethod”。如果使用的是 Auto,则匹配规则与平台有关(在 Windows NT 上为 Unicode,在 Windows 98 上为 Ansi)。如果 ExactSpelling 设置为 true,则只有当 DLL 中存在“MyMethod”时才返回“MyMethod”。

  3、EntryPoint 指示要调用的 DLL 入口点的名称或序号。
  如果你的方法名不想与api函数同名的话,一定要指定此参数,例如:

[DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]
  public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

  4、ExactSpelling 指示是否应修改非托管 DLL 中的入口点的名称,以与 CharSet 字段中指定的 CharSet 值相对应。如果为 true,则当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Ansi 值时,向方法名称中追加字母 A,当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Unicode 值时,向方法的名称中追加字母 W。此字段的默认值是 false。

  5、PreserveSig 指示托管方法签名不应转换成返回 HRESULT、并且可能有一个对应于返回值的附加 [out, retval] 参数的非托管签名。

  6、SetLastError 指示被调用方在从属性化方法返回之前将调用 Win32 API SetLastError。 true 指示调用方将调用 SetLastError,默认为 false。运行时封送拆收器将调用 GetLastError 并缓存返回的值,以防其被其他 API 调用重写。用户可通过调用 GetLastWin32Error 来检索错误代码。

本新闻共3页,当前在第1页  1  2  3  

展开更多 50%)
分享

猜你喜欢

C#中调用Windows API的要点

电脑网络
C#中调用Windows API的要点

Visual C#中调用Windows API的要点

编程语言 网络编程
Visual C#中调用Windows API的要点

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C#中调用API

编程语言 网络编程
C#中调用API

用Visual C#调用Windows API函数

电脑网络
用Visual C#调用Windows API函数

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Visual C#中调用Windows服务初探

编程语言 网络编程
Visual C#中调用Windows服务初探

C#中如何调用Delphi写的Dll

编程语言 网络编程
C#中如何调用Delphi写的Dll

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PHP网站后门的隐藏技巧测试报告

PHP网站后门的隐藏技巧测试报告

PSV《地狱军团》奖杯一览

PSV《地狱军团》奖杯一览
下拉加载更多内容 ↓