javascript的COM物件是什麼

2022-10-14 18:00:15

COM物件是指「元件物件模型物件」,是一個使用COM規格的可以重複使用的軟體元件;使用COM規格可以確保COM物件很好的工作,並且很容易的結合到你的應用程式中。COM物件一般用動態連線庫(DLL)實現;和普通的DLL一樣,COM物件暴露一些方法,使用者的應用程式能夠呼叫它,以便完成任何支援的操作。

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

本教學操作環境: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++ .

物件和介面

明白物件和介面之間的區別是很重要的。偶然的用法是, 有的時候一個物件的名字被參照為主要介面的名字。然而,嚴格的說,這兩個條件是不能互換的。

  • ▲一個COM物件能夠暴露任意數量的介面。例如:所有的COM物件必須暴露IUnknown介面,它們一般至少暴露一個附加的介面,也可能更多。為了使用這些特殊的方法,你不僅要建立COM物件,而且還要獲取正確的介面指標。

  • ▲很多的物件可能暴露相同的介面。一個介面是一組能夠執行指定操作的方法。介面的定義規定了方法的語法和他們功能。支援特殊操作的任何一個COM物件都暴露了一個適當的介面。有一些介面是高度專門化的,並且它們只被一個單一的物件暴露。其他多數情況下是被多個物件暴露的。一個很特殊的情況的是IUnknown介面必須被每一個COM物件暴露。

附註:假如一個物件暴露一個介面,它必須在介面中定義每一個支援的方法。換句話說,你能夠呼叫的任何方法都要確信它是存在的。然而,從一個物件到另一個物件,方法實現的細節是能夠改變的。例如:不同的物件可能用不同的演演算法得到最後的結果。有時候,一個物件暴露一箇舊的介面,僅僅需要支援方法的子集。你仍然能夠成功的呼叫餘下的其它方法,但是,他們將返回E_NOTIMPL。

COM標準要求一個介面一旦發行,它的定義便不能再改變。你不能再這個已經存在的介面中新增新的方法。你必須重新建立一個新的介面。通常一般的做法是在下一代介面中包含舊介面的所有方法,然後再新增上任何新的方法。

一個介面有幾代這是很常見的。通常,他們的實質是一樣的, 但是他們的細節不同。通常,一個物件能夠暴露每一代的介面。這樣做允許較老的程式繼續使用物件的較老的介面,同樣新的程式也能發揮新介面的特性。通常,介面家族有相同的名字,在名字的後面加上用於標示第幾代的整數。例如:假如原始介面的名字為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物件是什麼的詳細內容,更多請關注TW511.COM其它相關文章!