2010-11-17 132 views
2

我需要在直接C++(無ATL)中實現一個由傳統Web應用程序用來檢查我的應用程序是否存在的基本COM對象。 Web應用程序做這樣的事情(JavaScript的):實現一個簡單的COM對象

var object = new ActiveXObject("My.Application");

我要確保上述成功,但多數民衆贊成所有我需要做的 - 我不需要實現這個對象上的任何方法/屬性他們從未被調用過。

很明顯,我需要確保通過添加必要的註冊表設置等來註冊我的對象。我的應用程序是一個DLL,所以我想我還需要實現一些導出的函數(DllRegisterServer,DllUnregisterServer,DllCanUnloadNow和一個必須如此,DllGetClassObject)。

我敢肯定,簡單地從DllGetClassObject返回S_OK不會削減它。

如何在不使用ATL的情況下實現基本接口?如果有幫助,我正在使用MS編譯器。

+2

你爲什麼不想要ATL? – sharptooth 2010-11-17 11:15:53

+0

這是我被告知不使用的依賴項。我害怕我的手。 – Rob 2010-11-17 16:19:46

+0

這是簡單的。你可以靜態鏈接到ATL,所以你不需要攜帶ATL.dll - 甚至沒有人會看到它和**它會爲你節省大量的時間和錯誤。你最好的就是談判ATL的使用。 – sharptooth 2010-11-18 06:35:44

回答

3

建立一個基本的COM對象是不夠的。對於初學者來說,這將是如此的禿頭以至於沒有與之相關的名字。你已經發現你也需要一個對象工廠。

所以,是的,實施DllGetClassObject。您必須檢查輸入rclsid參數。這是一個接口標識符。如果您不認識,請返回CLASS_E_CLASSNOTAVAILABLE。顯然,由於駭人聽聞的方式(如你建議的無條件S_OK)Microsoft now passes at least one invalid class ID.。如果你說謊,並聲稱你能做到,Windows就不會相信你說的其他東西。

那麼,你應該聲稱哪些接口?顯然IUnknown - 這是系統的根本。最裸露的COM對象不會做其他任何事情。但是,您需要更多接口 - 該Web應用程序要求提供一個對象。這需要更多的接口。可能最簡單的方法是查看Windows要求的內容。我懷疑你至少需要IDispatch。

接下來,您將不得不實施一些方法。 「等等」,你可能會說,「他們不叫」。那麼,IDispatch是一種用於腳本語言的元接口。它用於枚舉哪些方法可用。因此,即使它將返回零腳本化的方法,接口也應該支持這種枚舉。

還有更多的細節,但這應該已經足以說服你使用ATL並獲取它的ActiveX代碼。這要比我在這裏列出的任何東西都要完整得多。

+0

感謝您的幫助。我實現了一個簡單的對象和工廠,它完美的工作。 – Rob 2010-11-18 09:12:37

1

還有什麼都沒有關於一個COM服務器的基礎知識,它支持在IE內運行的Javascript的後期綁定。如果你不知道如何實現DllGetClassObject(),那麼你需要所有的幫助。 ATL和內置於Visual Studio的嚮導可以爲您提供很多幫助。絕大多數富有的管道代碼都是自動生成的,包括那4個輸出。還有IDispatch,Javascript需要的接口。

使用ATL + ATL項目模板啓動項目。默認值是好的。右鍵單擊項目,添加,類,然後選擇ATL + ATL簡單對象。切換到類視圖,找到您的接口類型並右鍵單擊它以添加方法和屬性。