2011-03-15 32 views
0

我有一個32位的COM服務器DLL,需要從32位和64位應用程序中使用它。我可以創建一個COM +服務器應用程序,然後COM服務器將在代理過程中實例化。一旦我將COM服務器添加到COM +服務器應用程序中,我不能再在-proc中實例化它 - 爲什麼?

問題是我不能再實例化它作爲一個進程內服務器(CLSCTX_INPROC_SERVER標誌傳遞給CoCreateInstance()) - 我得到「類未註冊」。這不太好,因爲現在即使是32位應用程序也需要與代理進程交談,這增加了不必要的編組開銷。

如何設置一個COM +服務器應用程序,使得相同位數的客戶端仍然可以使用COM服務器in-proc?

+0

這是一個有點痛苦的事情,我做了一次,但我忘了如何。抱歉!我認爲所有這一切都是創建一個AppID,然後轉到Wow6432Node \ AppID並在那裏添加「DLLSurrogate」空字符串值。儘管你可能需要複製clsid條目。 – Ben 2011-03-15 13:43:00

+0

COM +讓我想起了Zawinski對正則表達式的評論,「現在你有兩個問題」。本的建議很好。 – 2011-03-15 14:01:50

回答

0

32位DLL只能在32位進程中加載​​,64位DLL在64位進程中(原因是指針大小不同,但也有調用約定)。因此,不能在64位應用程序中使用來自32位進程內服務器DLL的COM對象,因爲系統不會加載DLL。 Windows註冊表也有兩個不同的視圖,一個用於64位應用程序和一個用於32位應用程序。來自32位DLL的庫和接口以及coclasses在32位視圖中註冊,因此它們對64位應用程序不可見,這就是爲什麼您會收到該消息。

您需要一種解決方法,最簡單的解決方法是創建一個32位的進程外可執行文件,它承載一個包裝器COM,該包裝器充當前一個COM對象的代理(或外觀)。在你的64位應用程序中,你將使用這個新的包裝器。你可以在這裏閱讀更多關於:http://www.dnjonline.com/article.aspx?id=jun07_access3264

+0

他已經這樣做了,現在他有一個不同的問題,即32位應用程序也在使用代理過程。他希望32位應用程序實例化它,而64位應用程序使用代理。 – Ben 2011-03-15 13:41:18

+0

最簡單的解決方法是使用COM + - 無代碼,只需點擊幾次鼠標即可。 – sharptooth 2011-03-15 13:52:04

0

這可能與COM +有關,後者保留最近激活的對象的緩存。請參閱下面的評論this article