


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C#中调用W i n do w s AP I的要点在.Net Fr a mewo rk SDK文档中,关于调用 Win dow s A PI的指示比较零散,并且其中稍全面一点的是针对 V isu al Ba sic . ne t讲述的。本文将C#中调用AP I的要点汇集如下,希望给未在 C#中使用过API的朋友一点帮助。另外如果安装了 Visu al Stu d io . net的话,在C:P ro gr am F il e M icr o s o ft V is ual S tu di o .NET F ramew o rk SDK S aTech nolo In t eropPl a tf
2、o r m I nv oke W iCS 目录下有大量的调用 API 的例子。?一、调用格式u sin g S y st e m. R u ntime.I n teropSe rv ic e s;/引用此名称空间,简化后面的代码 ?.使用 Dl llm portAt t ribute 特性来引入 ap i函数,注意声明的是空方法,即方法体为空。?Dl II mp ort( "us er32.dll") ?pu bli c s ta t ic e xt e rn Re t urnT y pe Fu n c t io n Name(ty pe a r g 1 ,t y pe a
3、rg 2 ,.);/调用时与调用其他方法并无区别可以使用字段进一步说明特性,用逗号隔开,如:? DllI mpo rt( "kerne l 32", E ntryPo i nt="G e tVersionEx" ) ?D l lIm po rtAttrib ut e 特性的公共字段如下:? 1、Calli ng Con ven t ion 指示向非托管实现传递方法参 数时所用的Callin g C o nv en t i on值。? C a lling Conv ention.C d ecl :调用方清理堆栈。它使您能够调用具有 va rarg s的函数
4、。? Call i ng C onvent i on.S t dCall :被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。? 2、C h a rS et控制调用函数的名称版本及指示如何向方法封送S tr ing参数。此字段被设置为C ha rSet值之一。如果Char S et字段设置为Uni code,则所有字符串参数在传递到非托管实现之前都转换成Un i cod e 字符。这还导致向DLLEn tryPoi nt的名称中追加字母 W”如果此字段设置为 A n si,则字符串将转换成AN SI字符串,同时向 DL L En try Poi nt的名称中追加字母“A。大多数 W i
5、n32 AP I使用这种追加“W或“A勺约定。如果Ch a rSet设置为 Au t o,则这种转换就是与平台有关的(在 Wind ows NT 上为U n ico de,在 Windows 98上为 A n s i )。CharSe t的默认值为 Ansi。C h arSet字段也用于确定将从指定的 DLL 导入哪个版本的函数。C h arS et. Ansi和Ch arS e t. Uni c ode的名称匹配规则 大不相同。?对于An s i来说,如果将Ent ry Poi n t设置为“Myiet h o d"且它存在的话,则返回MyMethod'。如果DLL中没有
6、MyMetho d"但存在MyMethod A',则返回 “MyMet hod A "。对于Un i co d e 来说则正好相反。如果将 Ent ryPoint设置为“M Meth od"且它存在的话则返回My M e thod W"。如果 DLL中不存在 M yM eth o dW"但存在“MyMs thod "则返回M yM e th od"。如果使用的是 Auto,则匹配规则与平台有关(在 Win d ows N T上为 Unicode,在 Windo ws 98上为 An si)。如 果Exac t Sp
7、e l lin g设置为t rue,则只有当 DLL中存在“MyMethod时才返回“M M et ho d "。3、 E ntryPo i nt指示要调用的DL L入口点的名称或序号。?如果你的方法名不想与a p i函数同名的话,一定要指定此参数,例如:Dl lI mpo r t ("us e r 3 2.dll",Ch a rSet="Ch a rS e t.Au t o", En tryP oi nt=" Me ssage B ox") ?p u blic static exter nint M s gBox(I nt
8、 Ptr h Wnd, s tring txt,stri ng capti on, in t type);4、 Ex actSpe ll in g 指示是否应修改非托管 DLL 中的入口点的名称,以与 C har Se t字段中指定的CharS e t值相对应。如果为tru e,则当DllI mportA t tri bute .Char S e t字段设置为 C ha rS et的Ans i值时,向方法名称中追加字母 A,当D l l ImportA t tr i but e.C harS et字段设置为 Ch ar Se t的 Un ico de值时,向方法的名称中追加字母 W。此字段的默
9、认值是fa lse。5、 P r ese rveS i g指示托管方法签名不应转换成返回HRE SUL T、并且可能有一个对应于返回值的附加out, re t va l 参数的非托管签名。?6、SetL as tErro r指示被调用方在从属性化方法返回之前将调用W in32 API Se t La s tError。 t ru e指示调用方将调用 S etLa st Error,默认为fa ls e。运行时封送拆收器将调用 Ge tL as t Error并缓存返回的值,以防其被其他 A PI调用重写。用户可通过调用Ge tL astW in32Error来检索错误代码。二、参数类型:1、数
10、值型直接用对应的就可。(DW O RD -> i nt , WOR D -> In t 16) ?2、A P I中字符串指针类型 一> .n e t中string3、AP I中句柄(dWor d ) - > .net 中In tPtr4、A PI中结构-> .n et中结构或者类。注意这种情况下,要先用St ruct La yout特性限定声明结构或类?公共语言运行库利用St ru ctL a you t A ttri b u t e控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布
11、局是重要的。它的构造函数中用L a you t Kind值初始化Str u ctL a yout A ttr i but e类的新实例。Lay ou tK ind . S eque nti al用于强制将成员按其岀现的顺序进行顺序布局。? Layo u t Kind.Expl i cit用于控制每个数据成员的精确位置。利用E xpli c it,每个成员必须使用F ieldOffsetAttri bu te指示此字段在类型中的位置。如:Struc t Layout(La yo utKind.Ex pl i cit, Size= 16, CharSet二Cha r Se t .Ansi)publ
12、ic c l ass M ySystemTime?F i el dOf fs e t(0) p u bl i c ush o rt wY e a r; ? Fi e l dOf f set(2)public u s hor t wMon t h;? F ield O ffset(4)publi c ush o r t wDayOfWee k; ?F ie ldOffset(6) p ublic ushort w Day; ?FieldOf f set (8)public us h ort wH o u r ; ?Fie l dOffset(10) p ublic ushor t wM in u
13、t e ; ?Fi e ldO ff set (12)public us h ort w S e c ond; ?Fi eld Offs et(l 4)publi c u short wMill i s e cond s ; ?下面是针对 API中OSVERSI ON I N FO结构,在.n et中定义对应类或结构的例子API中定义原结构声明/ * * * * * * * * * * * * * * * * * * * * ? *OS VERSI ONI NF OA STRU C T? * dwOSVersio nIn f oSize DW ORD* d w Maj o rVersi o n
14、 DWORD ? ?* d w Mi no rVersio n DW ORD ?* d wBuildNumber DWORD ?* d w Platfor m I d DWORD ?* sz C SDV e r si on BYTE 128 dup (? )?* OSVERSIONINFOA ENDS*?* OSV ERSIONINFO equ <O S VE R S ION INFO A>?* * * * * * * * * * * * * * */. net 中声明为类? Str u ctL ayo u t ( Layou tK i nd.Se q u e ntia l ) p
15、ub l ic class OSVer sio nInfop ub l i c int OS V ersio n In f o Size;pu b lic in t ma j o r Ver s i o n; ?pub l ic i n t m i no rVersi on;p u blic int b u il d Numbe r ;pub l ic in t pla t fo rmI d;M a r shal As( Unmanag edTy p e .ByV a l T Str, S i z eCo n s t = l 28 )public St ri n g versi o n Str
16、i ng; ? ?/ / 或者.ne t中声明为结构? St r uc tLa yo ut ( L a yout Ki n d .Sequ en tial )p ubli c st r uct O SVer s io n In fo 2 ?public int O S Ver s ionInfo S iz e ;?pu b lic int m a jorVe rsi on ; ?public int m i n orVersi on ; ? p u bli c int b uild Numbe r pub l i c int pl at formId ;Ma rs hal As( Unm an
17、 a ge d Type . ByVa l TS t r, Si z eC on st=1 2 8 )public Stri ng vers ion Stri ng ; ?此例中用到Mas h alAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给Wi nd ows A PI函数的字符串 (LPStr):M arshal A s( U nma naged T y p e.L PSt r )?S t ring exis t i ng fil e ;M arsha l A s( Unm a naged T
18、yp e. LPS t r )S t ring newfile ;注意结构作为参数时候,一般前面要加上r e f修饰符,否则会出现错误:对象的引用没有指定对象的实例。:Dll I mpo rt( "ker ne 1 32", E ntr yPoi nt = GetVersi on Ex")pub 1 ic stati c e xte r n bool Ge t Vers ion Ex2( ref OSV e r s ionlnf o 2 o sv i );三、如何保证使用托管对象的平台调用成功?invoke调用失败。用如果在调用平台i nvoke后的任何位置都未引
19、用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台HandleRef包装句柄可保证在平台invoke调用完成前,不对托管对象进行垃圾回收。?例如下面:fs = new ( "a.txt", );? St rin g B u il de r buff e r = n e w St r in gBuild e r ( 5 ); int read = 0;R ea d, buff e r, 5, out r ea d, 0 ); / 调用 W i n API 中的 R ea d Fi 1 e 函数由于f s是托管对象,所以有可能在平台调用还未完成
20、时候被垃圾回收站回收。将文件流的句柄用Ha ndleR ef包装后,就能避免被垃圾站回收D 1 lImpor t ( " K e rn e13 2.dll" ) ?publ i c s tati c extern b oo1 R e a dFil e( ?Han d le R e f hn dRef,St r i ngBu i lder b u f f er, ?int numb e rO fB yt e sToR ea d, ?o ut i nt nu mberOfBytesR ead , ?r e f Ov e r 1ap ped flag );?fs = ne w ( "Handl e Ref.tx t",);H
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园水沟清理协议书
- 委托代理报税协议书
- 重庆工伤赔付协议书
- 酒吧营销培训协议书
- 商行转让转租协议书
- 投资合作租赁协议书
- 简易机械租赁协议书
- 增量分红合伙协议书
- 酒席订金协议书范本
- 钻石购买保密协议书
- 国家粮食和物资储备局招聘考试真题2024
- 部编版六年级语文下册期中考试卷(有答案)
- 生物-华大新高考联盟2025届高三3月教学质量测评试题+答案
- 演出经纪人资格证常见试题及答案分析
- 2024年河北建投集团招聘工作人员考试真题
- 2025年湖北省八市高三(3月)联考物理试卷(含答案详解)
- 贵州国企招聘2024贵州磷化(集团)有限责任公司招聘89人笔试参考题库附带答案详解
- 《哪吒电影产品的营销问题及完善对策研究10000字》
- 4.2依法履行义务 课件-2024-2025学年统编版道德与法治八年级下册
- 《上海金茂大厦》课件
- 2025年河南交通职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
评论
0/150
提交评论