没有合适的资源?快使用搜索试试~ 我知道了~
首页调用动态链接库API .doc
Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口, 也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样也能够调用动态链接库的API函数。.NET框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括操作系统提供的Windows API函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。C#为例简单介绍调用API的基本过程
资源详情
资源评论
资源推荐

函数是构筑 应用程序的基石,每一种 应用程序开发工具,它
提供的底层函数都间接或直接地调用了 函数,同时为了实现功能扩展,一
般也都提供了调用 函数的接口, 也就是说具备调用动态连接库的能力。
和其它开发工具一样也能够调用动态链接库的 函数。 框架本身提供了
这样一种服务允许受管辖的代码调用动态链接库中实现的非受管辖函数包括操作系统提
供的 函数。它能够定位和调用输出函数根据需要,组织其各个参数整型、
字符串类型、数组、和结构等等跨越互操作边界。
下面以 为例简单介绍调用 的基本过程:
动态链接库函数的声明
动态链接库函数使用前必须声明,相对于 函数声明显得更加罗嗦,前者通过
粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。
动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态
链接库的文件名。
譬如,你想调用 !! 中的 "#$ 函数,我们必须指明函数的名字
"#$ 或 "#$,以及库名字 我们知道 对每
一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的 % 版本和双字节字
符的 & 版本。
下面是一个调用 函数的例子:
' ()*+,! !!*)-).*"/0*%)!).)
1%).1%)2$2)%#.)
#/).#/)%)3
42))2$)4"/0%)#2%)#)5
其中入口点 )-) 标识函数在动态链接库的入口位置,在一个受管辖的工程
中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还
可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用
函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可
以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简
化了对 % 和 2 版本的调用。1%) 用于标识函数调用所采用的是 2
或是 % 版本,$2)%#=6 将告诉编译器让编译器决定使用 2 或者
是 版本。其它的参数请参考 "% 在线帮助
在 中,你可以在 )-) 域通过名字和序号声明一个动态链接库函数,如
果在方法定义中使用的函数名与 !! 入口点相同,你不需要在 )-) 域显示声明函
数。否则,你必须使用下列属性格式指示一个名字和序号。
' ()*(*)-).*02)(*3
' ()*(*)-).*7*3
值得注意的是,你必须在数字序号前加“#”
下面是一个用 "#$ 替换 "#$ 名字的例子:

'3
#%-)(,)()%/25
4228
' ()**)-).*"#$*3
42))2$))"#$)1%)#)$)%)#2))
)-5
9
许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户
定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式
化这个类型,以保持参数原有的布局和对齐。
提供了一个 %)2)!-)))4) 类,通过它你可以定义自己的格式化类型,
在受管辖代码中,格式化类型是一个用 %)2)!-)))4) 说明的结构或类成员,通
过它能够保证其内部成员预期的布局信息。布局的选项共有三种:
布局选项
描述
!-)+)()2
为了提高效率允许运行态对类型成员重新排序。
注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
!-)+$2)
对每个域按照 0&:) 属性对类型成员排序
!-)+%;)
对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
传递结构成员
下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给
库中的 ),2) 函数,
函数的不受管辖原型声明如下:
&&!),2)2),<2&)5
注意你必须通过引用传递 ,2) 结构参数,因为函数需要一个 ,2) 的结构指针。
'3
#%-)(,)()%/25
'%)2)!-)!-)+%;)3
42)2))8
42)$5
42)-5
9
'%)2)!-)!-)+$2)3
42)2),2)8
'0&:)=342)6)5
'0&:)>342))5
'0&:)?342)#1)5

'0&:)7342)4))(5
9
28
' ()**3
42))2$)),2)6,2))5
9
类似你可以调用 @)%-)(6 函数获得系统信息:
A#%-)(,)()%/25
'%)2)!-)!-)+%;)3
42)2)%B%"C0&8
42)&(5
42)#%D5
42)"((2)5
42)"$((2)5
42)2)/2"E5
42)(4&625
42)2-5
42)2)@)-5
42)2!/5
42)2,/5
9
' ()*E*3
))2$)/@)%-)(66%B%"C0&%5
%B%"C0&%.%B%"C0&5
@)%-)(66%5
类成员的传递
同样只要类具有一个固定的类成员布局,你也可以传递一个类成员给一个不受管辖的动态
链接库函数,下面的例子主要说明如何传递一个 ;) 顺序定义的 "-%-)((
类给 的 @)%-)(( 函数函数用 FGG调用规范如下H
/@)%-)((%B%""<%-)((5
不像传值类型类总是通过引用传递参数
'3
'%)2)!-)!-)+%;)3
422"-%-)((8
421)B5
421)")15
421) -&6E5
421) -5
421)I5
421)")5

421)%25
421)"25
9
28
' ()**3
42))2$)/@)%-)(("-%-)(()5
9
回调函数的传递H
从受管辖的代码中调用大多数动态链接库函数你只需创建一个受管辖的函数定义,然后调
用它即可这个过程非常直接。
如果一个动态链接库函数需要一个函数指针作为参数,你还需要做以下几步:
首先,你必须参考有关这个函数的文档,确定这个函数是否需要一个回调;第二,你必须
在受管辖代码中创建一个回调函数;最后,你可以把指向这个函数的指针作为一个参数创
递给 !! 函数
回调函数及其实现H
回调函数经常用在任务需要重复执行的场合譬如用于枚举函数譬如 中的
(0)0(字体枚举()打印机(窗口枚举函
数下面以窗口枚举为例谈谈如何通过调用 (函数遍历系统中存在的所有窗
口
分下面几个步骤H
7在实现调用前先参考函数的声明
&&!( ",&(02!,""(
显然这个函数需要一个回调函数地址作为参数
创建一个受管辖的回调函数这个例子声明为代表类型#)也就是我们所说的回
调它带有两个参数 1 和 (第一个参数是一个窗口句柄,第二个参数由应用程序
定义,两个参数均为整形。
当这个回调函数返回一个非零值时,标示执行成功,零则暗示失败,这个例子总
是返回 值,以便持续枚举。
最后创建以代表对象#),并把它作为一个参数传递给 (函数,
平台会自动地 把代表转化成函数能够识别的回调格式。
'3
#%-)(5
#%-)(,)()%/25
42#)42E)1)(5
422(,)8
' ()**3
42))2$))(2E$)-5

42))2/"
8
2E(-2E.2E(,),)5
((-2E=5
9
42))24,))1)(8
)*窗口句柄为*5
)!15
))5
9
9
指针类型参数传递:
在 函数调用时,大部分函数采用指针传递参数,对一个结构变量指针,
我们除了使用上面的类和结构方法传递参数之外,我们有时还可以采用数组传递参数。
下面这个函数通过调用 @)( 获得用户名
&&!@)(
!%,:FF用户名缓冲区
! &, %DFF存放缓冲区大小的地址指针
5
' ()*/*
)-).*@)()(*
$2)%#.6
%)!).)3
))2$)4@)()(
'"1(#-!-34-)'3:
'"1(#-!-3)'3%D5
这个函数接受两个参数,21<和 )<因为你必须分配一个字符串缓冲区以接受字符
串指针,你可以使用 %)# 类代替这个参数类型,当然你还可以声明一个字节数组传递
% 字符串,同样你也可以声明一个只有一个元素的长整型数组,使用数组名作为第二
个参数。上面的函数可以调用如下:
4-)'3).4-)'=35
)'3.)'735
'=3.=5
@)()()5
"#$%1%-)($)2#%@)%)#)5
最后需要提醒的是,每一种方法使用前必须在文件头加上:
#%-)(,)()%/25
剩余25页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0