欢迎来到天天文库
浏览记录
ID:37276792
大小:117.00 KB
页数:17页
时间:2019-05-20
《Microsoft .NET Compact Framework 上的高级 PInvoke》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Microsoft.NETCompactFramework上的高级P/Invoke发布日期:10/29/2004
2、更新日期:10/29/2004JonBox,DanFoxQuilogy编著:JonathanWellsMicrosoftCorporation适用于:Microsoft_.NETCompactFramework1.0Microsoft_VisualStudio_.NET2003摘要:探讨.NETCompactFramework的高级互操作性。本页内容简介封送处理复杂类型封送处理结构中
3、的字符串封送处理结构中的定长字符串小结简介在上一篇文章“Microsoft.NETCompactFramework上的P/Invoke和封送处理简介”中,我们讨论了Microsoft.NETCompactFramework和Microsoft.NETFramework中的平台调用服务如何允许托管代码调用驻留在非托管DLL中的函数,进而允许自定义以及操作系统(WindowsCE)API可由为上述任何一种框架编写的应用程序访问。虽然此服务的很多功能在这两种框架中都是一样的,但由于.NETCompac
4、tFramework是完整的.NETFramework的一个子集,所以存在一些差异,有些差异我们已经在上一篇文章中进行了探讨。在本白皮书中,我们将集中讨论在封送处理结构时产生的两个特定问题,以及在.NETCompactFramework中如何对它们进行处理。返回页首封送处理复杂类型正如上一篇文章中所提及的,.NETCompactFramework中的封送拆收器和完整的.NETFramework中的封送拆收器之间的一个主要差异是:较轻型的.NETCompactFramework封送拆收器不能封送处
5、理结构或类中的复杂对象(引用类型)。这就意味着,如果结构或类中有字段定义为在.NETCompactFramework和非托管代码之间不存在通用表示形式的类型(称为blittable类型,这些类型在上一篇文章中列出),则该结构或类不能被完全地进行封送处理。从实际的角度来说,这意味着包含字符串指针或者定长字符缓冲的结构或类均不能被正确地封送处理。作为一个例子,请考虑WindowsCE上可用的用户通知API。使用此API,应用程序可以在特定的时间,或者在响应某个事件(比如同步)时,或者在更换PC卡时,
6、显示通知对话框或引发某个应用程序的执行。因为.NETCompactFramework不包括执行此功能的托管类,所以需要该功能的开发人员就需要使用P/Invoke进行正确的操作系统调用。要使用WindowsCE通知API(CeSetUserNotificationEx),用于定义什么事件激活此通知的结构(CE_NOTIFICATION_TRIGGER)需要在托管代码中进行声明,并在VB.NET中进行如下的直接转换,其中SYSTEMTIME是另一个完全由blittable类型组成的结构,Notifi
7、cationTypes和EventTypes是映射至整数的枚举。PrivateStructureCE_NOTIFICATION_TRIGGERDimdwSizeAsIntegerDimdwTypeAsNotificationTypesDimdwEventAsEventTypesDimlpszApplicationAsStringDimlpszArgumentsAsStringDimstartTimeAsSYSTEMTIMEDimendTimeAsSYSTEMTIMEEndStructure不幸的
8、是,用于指定要执行的应用程序及其命令行参数的两个字符串值在非托管代码中定义为指向以null终止的Unicode字符串(WCHAR*)的指针。因此,.NETCompactFramework封送拆收器不能正确地封送处理该结构,因为String是引用类型(System.String)。注正如我们上一篇文章所提及的,System.String在.NETCompactFramework中是blittable类型,因为所有字符串均可视为Unicode。但是,这只在将String直接传递给非托管函数时才适用,
9、字符串用在结构或类中时并非如此。在完整的.NETFramework中,封送拆收器可以处理这种情况,因为它包含MarshalAsAttribute。使用此属性,该结构可被重写为:PrivateStructureCE_NOTIFICATION_TRIGGERDimdwSizeAsIntegerDimdwTypeAsNotificationTypesDimdwEventAsEventTypesDimlpszApplicationAsSt
此文档下载收益归作者所有