2013-03-07 125 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