2012-05-02 581 views
3

我指的這個線程註冊32位和64位的DLL

How do I install both 32-bit and 64-bit versions of a COM DLL and "auto-select"?

我們有完全相同的情況。命名空間擴展Dll 32位和64位具有相同項目中相同CLSID App ID的名稱空間擴展。現在註冊這兩個Dll的作品完美無瑕。取消註冊會導致一些錯誤。第一次取消註冊,但第二次失敗。因爲我認爲Windows(?)認爲Dll已經被註銷...

這兩個Dll是否需要不同的CLSID和/或App IDs?

親切的問候, 邁克爾

編輯: 這裏的DllUnregisterServer的做什麼:

STDAPI DllUnregisterServer(void){ 

    _AtlModule.UpdateRegistryAppId(FALSE); 
    HRESULT hRes2 = _AtlModule.UnregisterServer(TRUE); 
    if (hRes2 != S_OK) 
     return hRes2; 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 

    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) 
     return ResultFromScode(SELFREG_E_CLASS); 

    return NOERROR; 
} 
+0

我想「一些錯誤」應該給你一個錯誤的想法。 – sharptooth

+0

好吧,詳細它給了我錯誤代碼0x8002801c –

回答

1

Windows並不關心 - 這是regsvr32執行登記。對32位DLL使用32位版本的regsvr32,對於64位DLL使用64位版本。

兩個版本只是加載DLL,找到DllRegisterServer()/DllUnregisterServer()入口點,調用它並觀察返回的值。無論走到哪裏,都不是regsvr32業務。

你的問題是其中一個功能工作出錯。你必須調試這個。一個好的開始是使用Process Monitor實用程序來觀察執行的註冊表訪問以及它們是否是您期望的。

+0

嗯,應用程序的主框架是不是由我自己編碼,也許你可以看到上面的代碼中的東西... –

+0

@Jesse詹姆斯:這是不可能的猜測。一個好的開始是使用進程監視器來至少驗證訪問。 – sharptooth

+0

好吧,我試了一下,但是regsvr32創造了大約100.000個條目,我不知道該怎麼看待解決這個問題...... –

0

answer from sharptooth添加更多信息,如果您通過執行regsvr32以編程方式取消註冊您的dll,那麼您可能會調用錯誤的regsvr32文件。您需要確保您從System32調用regsvr32來取消註冊您的64位dll,並從SysWow64取消註冊regsvr32以取消註冊32位版本。您可以通過p/Invoke功能GetSystemWow64Directory來檢索SysWow64文件夾位置。

+0

我試圖在Windows 7下,它可以處理32位和64位,但我也試過調用SysWow64 regsvr32.exe,它也不工作。 –

+0

在這種情況下,您的DllUnregisterServer功能應該有點問題,因爲建議使用銳利信息。 – yms

+0

調試很難,我看不到hRes2的內容是什麼,它總是告訴我它找不到那個符號。但它是_AtlModule.UnregisterServer(TRUE);這不正常工作... –