2013-03-07 141 views
0

我有一個使用cpp COM對象的c#解決方案。 COM對象和C#應用程序都是專門爲64位系統構建的。當我從VS 2010運行時,該解決方案正常工作。但是,在我將其安裝在不同的系統(64位)上後,找不到COM對象。訪問COM對象

我想這是因爲它沒有在安裝過程中註冊,但我似乎在這樣做時遇到了麻煩。當我嘗試

regsvr32 ComObject.dll 

我得到一個錯誤,指出「該模塊的ComObject.dll「加載失敗。請確保該二進制存儲在指定的路徑或調試它來檢查與二進制或相關的問題.DLL文件。

我從dll所在的目錄調用regsvr32,並且三重檢查名稱輸入是否正確。我嘗試在安裝程序中註冊它,將dll Register切換到vsdrfCOM,並得到警告「無法爲名爲'ComObject.dll'的文件創建註冊信息。這很可能是因爲這個dll是在一個單獨的解決方案中構建的,並作爲資源添加到這個解決方案中。

因此,我可以將它安裝在我的開發系統上,它運行良好。我認爲這是因爲VS已經註冊了dll。 (目前,該DLL沒有安裝程序的一部分,因爲它造成的問題,所以我複製了一個在debug文件夾。

沒有人有任何想法我可能是做錯了?

其他信息:

基於從大衛赫弗南說明,我跑的Dependency Walker正確的方法下面是最後幾行之前,我得到的錯誤說

... 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "DrawThemeText") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBB61F8. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "EndBufferedAnimation") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBB4F98. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "GetBufferedPaintDC") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBC0BC0. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "GetBufferedPaintTargetDC") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBC0B5C. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "EndBufferedPaint") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBB4F98. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "FindGadgetFromPoint") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC581F40. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "ForwardGadgetMessage") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC582CAC. 

後,「入口點中的DllRegisterServer沒有被發現。」按OK,我會得到:

LoadLibraryW("comctl32.dll") called from "USER32.DLL" at address 0x00000000779A91DC. 
LoadLibraryW("comctl32.dll") returned 0x000007FEFCC10000. 
GetProcAddress(0x000007FEFCC10000 [COMCTL32.DLL], "RegisterClassNameW") called from "USER32.DLL" at address 0x00000000779A91F9 and returned 0x000007FEFCC38024. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintStopAllAnimations") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBCE408. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFCBBFA04. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DisableContainerHwnd") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A38C. 
GetProcAddress(0x000007FEFCBB0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "DUSER.DLL" at address 0x000007FEFC58069D and returned 0x000007FEFCBBFA04. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DUserFlushMessages") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A8A0. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DUserFlushDeferredMessages") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC57A830. 
GetProcAddress(0x000007FEFC570000 [DUSER.DLL], "DeleteHandle") called from "COMCTL32.DLL" at address 0x000007FEFCC2FD99 and returned 0x000007FEFC574BB8. 
GetProcAddress(0x00000000779A0000 [USER32.DLL], "UnregisterMessagePumpHook") called from "DUSER.DLL" at address 0x000007FEFC57B8A9 and returned 0x00000000779A8564. 
DllMain(0x0000000180000000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPIEX64.DLL" called. 
DllMain(0x0000000180000000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPIEX64.DLL" returned 1 (0x1). 
DllMain(0x000007FEFB5F0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPI32.DLL" called. 
DllMain(0x000007FEFB5F0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MAPI32.DLL" returned 1 (0x1). 
DllMain(0x0000000051AF0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MFC100.DLL" called. 
DllMain(0x0000000051AF0000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MFC100.DLL" returned 1 (0x1). 
DllMain(0x000007FEF9E60000, DLL_PROCESS_DETACH, 0x0000000000000000) in "MSIMG32.DLL" called. 
... 
Exited "REGSVR32.EXE" (process 0x23A0) with code 4 (0x4). 

除提到DllRegisterServer之外沒有任何特定的錯誤消息。我確實以管理員身份運行。在運行時,我在模塊列表中遇到了一個額外的錯誤:打開文件時出錯。該系統找不到指定的路徑。這是有道理的,因爲它是一個空字符串。這在它旁邊有一個問號,所以我假設它是延遲加載。

我的regsvr32.exe的又跑的Dependency Walker,並得到了以下錯誤:

LoadLibraryExW("C:\Program Files\Project\ComObject.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned NULL. Error: The specified module could not be found (126). 

我也發現了這些錯誤的日誌文件的頂部:

Error: Modules with different CPU types were found. 
Warning: At least one delay-load dependency module was not found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

謝謝大家您的幫助。

+0

COM對象可能缺少一些依賴關係嗎?我知道COM服務器不會註冊是依賴關係丟失。 – 2013-03-08 00:00:09

+0

@RobGoodwin - 我對它使用了Dependency Walker,它缺少IESHIMS.dll,但我的理解是,如果存在適當的錯誤處理,這是一個不需要的可選dll。我沒有開發cpp代碼,但有權訪問它。如果我確實需要確保它包含在dll中,我將如何添加它,以及爲什麼dll在沒有它的情況下運行?我的cpp技巧非常基礎。 – Tim 2013-03-08 00:08:28

+0

嘗試所述相同DLL的發佈版本。機率是你調試生成是依賴於MSVCRTD.DLL,MSVCPD.DLL等,其中沒有一個是乾淨的機器上。正確的VC運行時redist包加上你的DLL的Release-build可能會消除* major *依賴性問題。 – WhozCraig 2013-03-08 00:40:02

回答

0

謝謝大衛Hefferman和WhozCraig;您的信息幫助我開始使用Dependency Walker,在我弄清楚如何解釋它所發現的內容後,我將看到它將證明是一個強大的工具。它也幫助我追蹤可能出現的問題。

最後,我結束了一個不同的方向。我將cpp項目添加到我的主項目中,然後在我的安裝程序中使用輸出。這導致它正確註冊。我仍然不確定這與運行regsvr32有什麼不同,但無論區別如何,它都會導致事情開始發揮作用。

1

這可能是一個依賴問題。用Dependency Walker解決它。使用配置文件菜單啓動一個進程。運行regsvr32。指定命令行參數和工作目錄。

我的猜測是該問題是缺少MSVC運行時,但該工具將揭示是什麼導致失敗。

您需要運行提升的Dependency Walker,以便註冊可以工作。

+0

謝謝你的回覆。我確實發現無法找到IESHIMS.DLL,但我不太確定如何將其添加到DLL。我對cpp項目有很少的經驗。我的主要困惑是VS如何註冊dll,但我無法手動? – Tim 2013-03-08 01:08:39

+0

IESHIMS不相關。這是一個可選的延遲加載DLL。但我不認爲你明白我的答案。您尚未運行配置文件模式。 – 2013-03-08 07:10:53

+0

在開始工作之前,我之前沒有使用過Dependency Walker,所以我仍然在快速研究需要做什麼以及如何解釋結果。當我點擊配置文件時,我可以選擇啓動和停止分析,但它們都變灰。 – Tim 2013-03-08 15:46:21

0

通常Windows會對是否運行System32SysWOW64目錄中的應用程序感到困惑。

嘗試明確運行regsvr32的64位版本:

%SystemRoot%\System32\regsvr32.exe ComObject.dll 
+1

這將不會運行64位regsvr32。它運行與命令提示符相同的位。由於文件重定向器。所以這將從32位cmd.exe運行32位。這個答案中的代碼與Q中的代碼相同。如果它是比特,錯誤將會不同。 – 2013-03-08 00:49:17