2012-07-05 42 views
0

我正在研究一個ActiveX,其中相同的代碼庫應該用於兩個不同的ActiveX,也就是說,我有從多個DLL構建的單個解決方案。 當我構建用於爲ActiveX A創建CAB的解決方案時,我將DLL類ID更改爲特定的ID,並且當我爲創建第二個ActiveX的CAB而創建該ID時,我將類ID更改爲其他。ActiveX註冊

我需要兩個ActiveXs才能在同一臺機器上運行。 基本上,它工作正常,除了在某些情況下,我運行不同版本的ActiveX(ActiveX A是從比ActiveX B舊代碼版本)有不想要的行爲。 它看起來像ActiveX從ActiveX B(這是從不同的代碼版本)加載一些DLL。

對不起,長的描述,但最後的重要信息,因爲這兩個ActiveXs來自相同的代碼,我有相同的類名暴露給調用ActiveX的JavaScript。 在註冊表存在除了以下所有的鍵總分離(的NetworkInterface在暴露的類):

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyActiveX.NetworkInterface\CLSID] 
@="{31ED2205-F6AE-4133-AD30-60CA2783ADA6}" 

當安裝的ActiveX我看到的正確的類ID這個條目,但在安裝第二個ActiveX密鑰時被第二個ActiveX覆蓋。

是否有可能實現我想要實現的目標? 有沒有辦法讓同一個班級註冊不同的班級ID?

謝謝。

回答

0

@Lior,你用這句話自己回答了你的問題:「讓同一個班級註冊不同的班級ID」。實際上,我們正在談論ProgID或程序標識符 - 您的案例中的MyActiveX.NetworkInterface。

ProgID的只有一個專用註冊表配置單元 - HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \,並且如果您在客戶端代碼中使用ProgID來實例化組件,則只能爲一個ActiveX組件執行此操作。當您使用ProgID創建實例時,將使用該註冊表配置單元確定相應的CLSID,並使用實現該類的可執行DLL/OCX/EXE。對於後一種情況,相應的註冊表配置單元是這樣的:

HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID {6935DB93-21E8-4ccc-BEB9-9FE3C77A297A} \ InProcServer32中

可在這種情況下,做的最好的事情是爲兩個ActiveX組件使用兩個不同的ProgID。即使您對主類使用相同的源代碼,也可以在兩個不同的項目中「按原樣」使用它們,這些項目用於使用單獨的ProgID編譯組件。看來,所有的開發環境(你可能使用的VB6)都可以讓你做到這一點。

這個一些更多的信息可以在本文中找到:http://www.vbaccelerator.com/progid.htm

我們有同樣的問題與我們的ActiveX組件,以及我們的經驗告訴我們,有不同的ProgID的是最好的選擇。即使您發佈下一個版本,請更改ProgID。這將允許兩個版本在同一操作系統中共存,而不會出現任何問題,開發人員可以逐步升級現有項目。

===

作爲一個回答你的問題,我有一個如何嘗試解決你的問題,如果你不能改變的ProgID的一個想法。據我所知,你可以直接使用他們的CLSID來激活ActiveX,而不同的開發環境使用不同的技術。我沒有你的項目,但如果你使用JavaScript,你可以嘗試從這篇文章的食譜:

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/08652e9e-7deb-40a3-8c1a-f9becdcbf56e/

簡而言之,你不需要用這樣的調用來創建您的ActiveX對象:

myobject = new ActiveXObject("SAMPLEACTIVEX.sampleActiveXCtrl.1"); 

你需要把使用OBJECT標籤頁面上你的兩個ActiveX控件和網頁上使用他們的名稱(ID的)打電話給你的對象的方法。如果你看一下HTML OBJECT標籤的例子,你會看到這樣的事情:

正如你所看到的,你可以使用指定的ID來訪問你到底需要的對象的成員。許多例子已經在SO - 這裏是其中之一:

javascript: "Object doesn't support this property or method" when ActiveX object called