2013-05-29 22 views
0

我有一個ActiveX控件項目(.ocx),其中包含一個主控制類和幾個其他ATL簡單對象。主要的控制類暴露了許多功能;如果我可以在其他ATL對象中使用這些函數中的一些,這將是切實可行的。這可能嗎?我是否必須在其導出的ATL對象之一中實例化我的ActiveX控件(以及如何?),還是有其他方法?我可以從同一個項目中的另一個ATL簡單對象訪問ActiveX項目功能嗎?

+0

使用'CoCreateInstance()'就像創建任何COM對象一樣。 –

+0

我認爲你應該考慮反應你的功能。如果.ocx公開的功能值得其他組件使用(或任何通常不會託管.ocx的功能),它很可能會暴露在錯誤的位置。嘗試將該功能分離到它自己的組件中(或者作爲其中一個現有組件的一部分)。如果功能對OCX上下文以外的外部客戶端沒有意義,那麼可以將該功能移到內部可用於所有COM對象的常規C++類,並使OCX簡單地將調用轉發給此C++類。 –

回答

1

雖然你沒有在你的問題中提到它,但我假設你目前沒有訪問要創建的對象的接口/ coclass decalration。

如果要使用的控件具有與其關聯的應用程序標識,則可以使用#import指令將接口和類型定義直接引入到C++源文件中。例如,如果應用程序ID爲「Library.MainObject」你可以不喜歡下面

#import "progid:Library.MainObject" 

這將直接訪問對象的類型庫。如果它沒有與之關聯的應用程序ID,則可能需要執行一些額外的步驟。獲取類型庫的一種方法是使用Visual Studio附帶的OLE Object Viewer實用程序。一旦在Object Viewer中找到它,您可以將類型庫保存爲文件。如果在對象查看器中找不到它,則可以嘗試直接打開OCX模塊,如果它包含類型庫,則可以將其導出到文件中。一旦你有了類型庫,你可以使用#import來引入聲明。

#import "typelibraryname.tlb" 

一旦你獲得了聲明,你可以調用CoCreateInstance就像你對任何其他COM對象。您可以使用__uuidof(typename)來獲取接口或協同類的GUID。

相關問題