通訊協(xié)議046——全網(wǎng)獨(dú)有的OPC HDA知識(shí)一之接口(一)

本文簡(jiǎn)單介紹OPC HDA規(guī)范的接口的一般信息,以及有關(guān)OPC設(shè)計(jì)者期望如何實(shí)現(xiàn)和使用這些接口的一些背景信息。,更多通信資源請(qǐng)登錄網(wǎng)信智匯(wangxinzhihui.com)。
1、內(nèi)存所有權(quán)
根據(jù)COM規(guī)范,客戶端必須釋放與“out”或“in/out”參數(shù)關(guān)聯(lián)的所有內(nèi)存。這包括由任何結(jié)構(gòu)內(nèi)的元件指向的存儲(chǔ)器。這一點(diǎn)對(duì)于客戶端編寫人員來說非常重要,否則他們將遇到難以找到的內(nèi)存泄漏。請(qǐng)參閱IDL文件以確定哪些參數(shù)是out參數(shù)。推薦的方法是客戶端創(chuàng)建一個(gè)子例程,用于正確釋放每種類型的結(jié)構(gòu)。
??? 與成功/失敗無關(guān),服務(wù)器必須始終為“out”參數(shù)返回定義良好的值。釋放分配的資源是客戶的責(zé)任。
注:如果錯(cuò)誤結(jié)果是任何FAILED錯(cuò)誤,如E_OUTOFMEMORY,則OPC HDA服務(wù)器應(yīng)為所有“out”指針返回NULL(這是標(biāo)準(zhǔn)COM行為)。此規(guī)則也適用于以下許多函數(shù)返回的錯(cuò)誤數(shù)組(ppErrors)。通常,一個(gè)健壯的OPC客戶端應(yīng)該在釋放每個(gè)“out”或“In/out”指針之前檢查其是否為NULL。
?
2、標(biāo)準(zhǔn)接口
根據(jù)COM規(guī)范,所有方法都必須在每個(gè)必需的接口上實(shí)現(xiàn)。
根據(jù)COM規(guī)范,支持的任何可選接口都必須實(shí)現(xiàn)該接口中的所有函數(shù),即使該實(shí)現(xiàn)只是返回E_NOTIMPL的存根實(shí)現(xiàn)。
?
3、 Null Strings and Null Pointers
以下使用這兩個(gè)術(shù)語。它們不是一回事。NULL指針是一個(gè)無效的指針(0),如果使用它將導(dǎo)致異常。NULL字符串是指向1個(gè)字符數(shù)組的有效(非零)指針,其中該字符為NULL(即0)。如果NULL字符串作為[out]參數(shù)(或結(jié)構(gòu)的元素)從方法返回,則必須釋放該字符串,否則包含NULL的內(nèi)存將丟失。還要注意,由于COM封送限制,不能為[in,string]參數(shù)傳遞NULL指針。在這種情況下,應(yīng)傳遞指向NULL字符串的指針,以指示省略的參數(shù)。
?
4、返回?cái)?shù)組
您將注意到IDL中的語法size_is(,dwCount)與指向指針的指針結(jié)合使用。這表示返回的項(xiàng)是指向指示類型的實(shí)際數(shù)組的指針,而不是指向指示類型項(xiàng)的指針數(shù)組的指針。這簡(jiǎn)化了服務(wù)器和客戶端對(duì)數(shù)據(jù)的封送、創(chuàng)建和訪問。
?
5、異步/同步接口
客戶端從服務(wù)器獲取數(shù)據(jù)有兩種方式。
1)它可以執(zhí)行同步讀?。ê?jiǎn)單且相當(dāng)高效)。這可能適用于讀取相對(duì)少量數(shù)據(jù)且不考慮最大效率的相當(dāng)簡(jiǎn)單的客戶端。以這種方式操作的客戶端愿意阻止并等待結(jié)果。當(dāng)請(qǐng)求大量數(shù)據(jù)時(shí),這可能需要一些時(shí)間。這種方法適用于報(bào)告或其他非交互式閱讀,但對(duì)于交互式顯示來說非常糟糕。
2)它可以使用異步方法“訂閱”數(shù)據(jù),異步方法更復(fù)雜,但非常高效。這是交互式客戶端的推薦行為,因?yàn)檫@將最大限度地減少顯示鎖定??蛻舳丝梢栽诘却龜?shù)據(jù)返回的同時(shí)自由處理其他交互。
?
6、錯(cuò)誤及返回碼
OPC規(guī)范描述了OPC HDA服務(wù)器實(shí)現(xiàn)的接口和相應(yīng)行為,以及OPC客戶端應(yīng)用程序所依賴的接口和行為。OPC特定錯(cuò)誤和返回代碼的列表包含在本規(guī)范的OPC錯(cuò)誤代碼摘要部分。對(duì)于下面描述的每種方法,都包括所有可能的OPC錯(cuò)誤代碼以及最常見的OLE錯(cuò)誤代碼的列表。在實(shí)踐中,客戶端可能會(huì)遇到額外的錯(cuò)誤代碼,如RPC和安全相關(guān)代碼,他們應(yīng)該做好處理這些代碼的準(zhǔn)備。
在某些情況下,還允許服務(wù)器返回供應(yīng)商特定的錯(cuò)誤代碼。這樣的代碼可以傳遞給GetErrorString方法。稍后將對(duì)此進(jìn)行更詳細(xì)的討論。
在所有情況下,“E”錯(cuò)誤代碼將指示FAILED類型錯(cuò)誤,“S”錯(cuò)誤代碼至少指示部分成功,最低限度地指示ppErrors數(shù)組中有更多信息可用。服務(wù)器在返回“S”錯(cuò)誤代碼時(shí)可能返回?cái)?shù)據(jù),也可能不返回?cái)?shù)據(jù),但如果調(diào)用中提供了指向ppErrors數(shù)組的指針,則它必須始終返回ppErrors陣列。如果返回給客戶端的任何ppErrors代碼不是S_OK,則服務(wù)器必須返回S_FALSE,以指示客戶端應(yīng)檢查ppErrors數(shù)組以獲取詳細(xì)信息。
對(duì)于所有接口的所有方法,如果從調(diào)用返回FAILED代碼,則客戶端應(yīng)該認(rèn)為所有輸出值都無效,而服務(wù)器應(yīng)該為所有“out”參數(shù)返回NULL指針。這是標(biāo)準(zhǔn)的COM行為。對(duì)于異步接口,如果調(diào)用返回了FAILED代碼,或者返回了S_FALSE,并且單個(gè)項(xiàng)的ppErrors代碼都是FAILED代碼時(shí),將不會(huì)進(jìn)行回調(diào)。
通常,客戶端在釋放每個(gè)“out”或“In/out”指針之前,應(yīng)始終檢查其是否為NULL值。
?
7、IUnknown
服務(wù)器必須提供標(biāo)準(zhǔn)的IUnknown接口。由于這是一個(gè)定義良好的接口,因此不進(jìn)行詳細(xì)討論。有關(guān)更多信息,請(qǐng)參閱OLE程序員參考資料。必須提供此接口,并按照Microsoft的要求實(shí)現(xiàn)所有功能。
?
未完待續(xù)。更多通信資源請(qǐng)登錄網(wǎng)信智匯(wangxinzhihui.com)。