COM物件是指“組件物件模型物件”,是一個使用COM規格的可以重複使用的軟體元件;使用COM規格可以確保COM物件很好的工作,並且很容易的結合到您的應用程式中。 COM物件一般用動態連接程式庫(DLL)實作;和普通的DLL一樣,COM物件暴露一些方法,使用者的應用程式能夠呼叫它,以便完成任何支援的操作。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
什麼是COM物件?
元件物件模型(COM)物件是一個使用COM規格的可以重複使用的軟體元件。使用COM規格可以確保COM物件很好的工作,並且很容易的組合到你的應用程式中。事實上,COM基本上相當於一個黑盒子,這個黑盒子能為你的應用程式完成很多的工作。
COM物件一般用動態連線庫(DLL)實作。和普通的DLL一樣,COM物件暴露一些方法,你的應用程式能夠呼叫它,以便完成任何支援的操作。應用程式與COM物件的互動有點兒像應用程式與C 物件之間的交互作用,但他們之間又有一些明顯的差異。
COM物件實作了精確的封裝。你不能簡單的創建一個物件和任意呼叫它的公共方法。一個COM物件的公共方法被放入一個或更多的介面組中。對於方法的使用,你必須建立一個COM對象,並且從這個COM物件中取得這個COM物件的一個適當的介面。例如: IDirect3DCubeTexture8介面中包含一個使你能夠處理立方體架構資源的方法。不屬於這個介面的任何方法都是不能夠存取的。
COM物件的建立不同與C 物件的建立。有幾種方法可以建立COM對象,但都涉及了COM-specific 技術。微軟的DirectX應用程式介面(API)包含了用於創建大多數DirectX物件的各種各樣的幫助函數和方法。
你必須用COM_specific 技術控制COM物件的壽命。
COM物件不需要被顯示的調入。 COM物件被包含在一個DLL中。然而,在你使用這個COM物件的時候,不需要顯示的調入DLL或著顯示調入靜態接庫。每個COM物件都有一個用來建立這個物件的唯一的註冊ID. COM會自動的調入正確的DLL.
COM是二進位規格的。 COM物件可以從各種的各樣的語言寫入和存取。你不需要知道關於COM物件原始碼的任何事情。例如:Microsofe Visual Bisice 應用程式日常以COM物件寫入C .
物件與介面
一個介面有幾個世代這是很常見的。通常,他們的實質是一樣的, 但是他們的細節不同。通常,一個物件能夠暴露每一代的介面。這樣做允許較老的程式繼續使用物件的較老的接口,同樣新的程式也能發揮新接口的特性。通常,介面家族有相同的名字,在名字的後面加上用來標示第幾代的整數。例如:假如原始介面的名字為IMyInterface, 那麼下兩代的介面被命名為IMyInterface2和IMyInterface3。整數標示一般用directx的版本號。
GUIDS
全域唯一標示符(GUIDS)是COM程式模式的一個關鍵的部分。最基本的原則,GUIDS是一個128位元的結構。然而,GUIDS的創建方式能夠保證任何的兩個GUIDS都是不相同的。 COM廣泛的使用GUIDS有兩個主要的目的:
1.為了唯一標示一個特定的COM物件。
2.為了唯一標示一個特定的COM介面。
傳回值(HRESULT)
# 所有的COM方法傳回一個名叫HRESULT的32位元值。對於大多數方法,HRESULT 實際上是一個包含了兩個部分資訊的結構。
1、此方法是否成功或失敗。
2、輸出關於方法支援的操作的詳細資訊。
有些方法傳回的HRESULT的值是在Winerror.h中進了定義的。方法傳回的HRESULT值也可以是使用者專門的一些資訊。這些值通常會在方法的參考頁面中被驗證。
事實上,COM物件的方法呼叫能夠傳回各種各樣的表示呼叫成功或失敗的程式碼,這意味著你必須要很小心的測試其回傳值。例如:假如一個方法呼叫的回傳值是
S_OK,這表示這個方法呼叫成功,如果傳回值時S_FAIL,表示呼叫失敗,當然,方法呼叫也可能回傳其他的標識呼叫成功或失敗的程式碼。下面的程式碼段舉例說明對程式碼進行這樣的簡單的測試是不安全的。程式碼中hr的值時該方法呼叫的回傳值:
if( hr == E_FAIL ) { //Handle the failure } else { //Handle the success }
如果這段程式碼只回傳E_FAIL,這個程式碼段能夠很好的工作。然而,事實不是這樣,這個方法調用還有可能返回其他的值,例如:E_NOTIMPL, E_INVALIDARG.如果代碼返回這些值,這個代碼段沒有對其進行處理,默認會標識程序執行正常,然而實際程序是出現錯誤的。
如果你想知道關於方法呼叫的更詳細的信息,你必須測試每一個相關的回傳值。然而,你也許只想知道這個方法呼叫是否成功。有一個很好的方法可以讓你測試方法呼叫是否成功,就是把方法的回傳值傳遞給下面的兩個宏,他們在winerror.h檔案中定義。
1、巨集SUCCEEDED 回傳TRUE表示呼叫成功,回傳FALSE表示呼叫失敗。
2、巨集FAILED 回傳TRUE 表示呼叫失敗,回傳FALSE表示呼叫成功。
你可以用FAILED巨集來修改一下前面的程式碼段。
if( FAILED(hr) ) { //Handle the failure. } else { //Handle the success. }
上面的程式碼段對E_NOTIMPL 和 E_INVALIDARG的錯誤進行了處理。
雖然大部分的方法的回傳值HRESULT是一個結構值,但有少數的方法的回傳值HRESULT是一個簡單的整數值。這就隱含著傳回整數值的這些方法總是能夠呼叫成功。假如你將這種類型的回傳值傳遞給SUCCESS宏,這個宏將總是回傳TRUE。一個常見的例子是:IUnkoown::Release 方法。這個方法的作用是釋放(減少)一個物件的使用計數,並傳回物件目前的使用計數。使用計數用來標識物件的存在壽命。
指標的地址
假如你看到一些COM方法的參考頁面,你可能遇到過像下面的這樣的一些情況:
HRESULT CreateDevice( . . . IDirect3DDevice8 **ppReturnedDeviceInterface )
通常,任何一個c 或c 開發者對指標都很熟悉,COM通常用一個附加的間接標準。這個標準是:在兩個星號(**)後面緊跟著類型說明和帶有典型"pp"前綴的變數的名字來標識。在前面的範例中,ppReturnedDeviceInterface參數是一個指向IDirect3DDevice8介面的指標的位址。
和c 不一樣,你無法直接存取COM物件的方法,取而代之的是,你必須取得一個能夠暴露方法的一個介面的指標。呼叫物件介面的方法的語法和用指標呼叫c 方法的語法是一樣的。例如:呼叫IMyTnterface::DoSomething 的方法,你只要使用下面的語法就行了。
IMyInterfance *pMyTface; . . . pMyIface->DoSomething(...) ;
對於COM物件介面的指標來說,你不能直接建立一個指向介面的指標。你必須呼叫一個或多個其他的方法來得到這個指標。例如:前面提到的CreateDevice方法。
透過這個方法得到介面的指針,你需要宣告一個變量,用來指向你所要求的介面。把這個變數的位址傳遞給CreateDevice方法,換句話說,你必須給這個方法傳遞一個變數的位址。當這個方法返回的時候,這個變數將指向你所請求的接口,並且你能夠透過這個指標來存取這個接口的其方法。
更多程式相關知識,請造訪:程式設計影片! !
以上是javascript的COM物件是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!