当前位置:编程学习 > C#/ASP.NET >>

VB.NET及C#调用API

C#调用API:


[DllImport("user32.dll")]
public static extern int GetWindow (int hwnd,int wCmd);
//在括号里写上API的*.DLL文件名,并在下一行写上API函数原型即:
//可在函数原型上写是权限,如公有,私有,在权限后的是static[静态],接着是extern[外部],再来的就是函数原型了
//如以下:
[DllImport("user32.dll")]
public static extern int FindWindowEx (int hwndParent,int hwndChildAfter,string lpszClass,string lpszWindow);
[DllImport("user32.dll")]
public static extern int SendMessage (int hwnd,int wMsg,string wParam,string lParam);
[DllImport("user32.dll")]
public static extern int FindWindow (string lpClassName,string lpWindowName);

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

下面以c#为例简单介绍调用api的基本过程:   
动态链接库函数的声明   
 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过  Api  Viewer粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。 

 动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。   
   譬如,你想调用User32.DLL中的MessageBox函数,我们必须指明函数的名字MessageBoxA或MessageBoxW,以及库名字User32.dll,我们知道Win32  API对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI版本和双字节字符的UNICODE版本。 

 下面是一个调用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标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助. 

 在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义中使用的函数名与DLL入口点相同,补充:asp.net教程,.Net开发

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,