我有一個使用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.
謝謝大家您的幫助。
COM對象可能缺少一些依賴關係嗎?我知道COM服務器不會註冊是依賴關係丟失。 – 2013-03-08 00:00:09
@RobGoodwin - 我對它使用了Dependency Walker,它缺少IESHIMS.dll,但我的理解是,如果存在適當的錯誤處理,這是一個不需要的可選dll。我沒有開發cpp代碼,但有權訪問它。如果我確實需要確保它包含在dll中,我將如何添加它,以及爲什麼dll在沒有它的情況下運行?我的cpp技巧非常基礎。 – Tim 2013-03-08 00:08:28
嘗試所述相同DLL的發佈版本。機率是你調試生成是依賴於MSVCRTD.DLL,MSVCPD.DLL等,其中沒有一個是乾淨的機器上。正確的VC運行時redist包加上你的DLL的Release-build可能會消除* major *依賴性問題。 – WhozCraig 2013-03-08 00:40:02