資源描述:
《Microsoft .NET Compact Framework 上的高級 PInvoke》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Microsoft.NETCompactFramework上的高級P/Invoke發(fā)布日期:10/29/2004
2、更新日期:10/29/2004JonBox,DanFoxQuilogy編著:JonathanWellsMicrosoftCorporation適用于:Microsoft_.NETCompactFramework1.0Microsoft_VisualStudio_.NET2003摘要:探討.NETCompactFramework的高級互操作性。本頁內(nèi)容簡介封送處理復(fù)雜類型封送處理結(jié)構(gòu)中
3、的字符串封送處理結(jié)構(gòu)中的定長字符串小結(jié)簡介在上一篇文章“Microsoft.NETCompactFramework上的P/Invoke和封送處理簡介”中,我們討論了Microsoft.NETCompactFramework和Microsoft.NETFramework中的平臺調(diào)用服務(wù)如何允許托管代碼調(diào)用駐留在非托管DLL中的函數(shù),進(jìn)而允許自定義以及操作系統(tǒng)(WindowsCE)API可由為上述任何一種框架編寫的應(yīng)用程序訪問。雖然此服務(wù)的很多功能在這兩種框架中都是一樣的,但由于.NETCompac
4、tFramework是完整的.NETFramework的一個(gè)子集,所以存在一些差異,有些差異我們已經(jīng)在上一篇文章中進(jìn)行了探討。在本白皮書中,我們將集中討論在封送處理結(jié)構(gòu)時(shí)產(chǎn)生的兩個(gè)特定問題,以及在.NETCompactFramework中如何對它們進(jìn)行處理。返回頁首封送處理復(fù)雜類型正如上一篇文章中所提及的,.NETCompactFramework中的封送拆收器和完整的.NETFramework中的封送拆收器之間的一個(gè)主要差異是:較輕型的.NETCompactFramework封送拆收器不能封送處
5、理結(jié)構(gòu)或類中的復(fù)雜對象(引用類型)。這就意味著,如果結(jié)構(gòu)或類中有字段定義為在.NETCompactFramework和非托管代碼之間不存在通用表示形式的類型(稱為blittable類型,這些類型在上一篇文章中列出),則該結(jié)構(gòu)或類不能被完全地進(jìn)行封送處理。從實(shí)際的角度來說,這意味著包含字符串指針或者定長字符緩沖的結(jié)構(gòu)或類均不能被正確地封送處理。作為一個(gè)例子,請考慮WindowsCE上可用的用戶通知API。使用此API,應(yīng)用程序可以在特定的時(shí)間,或者在響應(yīng)某個(gè)事件(比如同步)時(shí),或者在更換PC卡時(shí),
6、顯示通知對話框或引發(fā)某個(gè)應(yīng)用程序的執(zhí)行。因?yàn)?NETCompactFramework不包括執(zhí)行此功能的托管類,所以需要該功能的開發(fā)人員就需要使用P/Invoke進(jìn)行正確的操作系統(tǒng)調(diào)用。要使用WindowsCE通知API(CeSetUserNotificationEx),用于定義什么事件激活此通知的結(jié)構(gòu)(CE_NOTIFICATION_TRIGGER)需要在托管代碼中進(jìn)行聲明,并在VB.NET中進(jìn)行如下的直接轉(zhuǎn)換,其中SYSTEMTIME是另一個(gè)完全由blittable類型組成的結(jié)構(gòu),Notifi
7、cationTypes和EventTypes是映射至整數(shù)的枚舉。PrivateStructureCE_NOTIFICATION_TRIGGERDimdwSizeAsIntegerDimdwTypeAsNotificationTypesDimdwEventAsEventTypesDimlpszApplicationAsStringDimlpszArgumentsAsStringDimstartTimeAsSYSTEMTIMEDimendTimeAsSYSTEMTIMEEndStructure不幸的
8、是,用于指定要執(zhí)行的應(yīng)用程序及其命令行參數(shù)的兩個(gè)字符串值在非托管代碼中定義為指向以null終止的Unicode字符串(WCHAR*)的指針。因此,.NETCompactFramework封送拆收器不能正確地封送處理該結(jié)構(gòu),因?yàn)镾tring是引用類型(System.String)。注正如我們上一篇文章所提及的,System.String在.NETCompactFramework中是blittable類型,因?yàn)樗凶址梢暈閁nicode。但是,這只在將String直接傳遞給非托管函數(shù)時(shí)才適用,
9、字符串用在結(jié)構(gòu)或類中時(shí)并非如此。在完整的.NETFramework中,封送拆收器可以處理這種情況,因?yàn)樗琈arshalAsAttribute。使用此屬性,該結(jié)構(gòu)可被重寫為:PrivateStructureCE_NOTIFICATION_TRIGGERDimdwSizeAsIntegerDimdwTypeAsNotificationTypesDimdwEventAsEventTypesDimlpszApplicationAsSt