debuggingCOM服务器连接到VBA / Excel

我遵循了为Python的comtypes模块提供的文档( http://pythonhosted.org/comtypes/server.html ),并构build了一个简单的COM服务器。

这似乎是正常工作。 我可以看到typelib和接口被注册(使用Oleviewer),并从一个Python脚本我可以调用(单)方法,增加了两个整数。

但是,我无法使其与Excel(Office 2007,在Win7上运行)工作。 下面的简单函数不起作用(调用MyMethod时停止执行)

Function test(a, b) Dim x As New MyTypeLib.MyObject ab = x.MyMethod(a, b) Debug.Print "d" & CStr(ab) test = ab End Function 

有没有什么办法来debugging呢?

更多评论

隧道尽头有灯光。 build议使用VBScript是有帮助的。 以下简短的脚本不起作用(提供COM服务器工作的独立确认)。

 Dim x,ab Set x = CreateObject("MyTypeLib.MyObject") ab = x.MyMethod(1, 2) MsgBox CStr(ab) 

但是,VBScript正在使用后期绑定调用服务器,并试图让早期绑定工作。

所以,我改变了我的Excel VBAfunction,以使用后期绑定和预期的事情工作,但他们不。

这里是修改后的VBA:

 Function test(a, b) Dim x As Object Set x = CreateObject("MyTypeLib.MyObject") gadd = x.MyMethod(1, 5) End Function 

所以我的服务器可以用于从Python和VBScript的后期绑定,但不是Excel!

使用进程监视器我可以看到,在晚期和早期绑定的情况下,Excel尝试加载msvcr90.dll失败,即使这个DLL安装在系统上。

以下是Process Monitor的截图,显示64位Windows 7 Home Edition上的Office Excel 2007开始尝试加载msvcr90.dll

在这里输入图像说明

当我发布这个问题时,我需要更多地了解如何debuggingCOM服务器(实际上更多!)。 事实certificate,有几个问题阻止了我的服务器工作。 我认为找出这些工具可能与实际问题一样重要,所以这个答案将试图涵盖两者。

最初,使用VBScript提供服务器注册和工作的独立validation(简单代码如上所示)是有帮助的。 VBScript使用后期绑定,我想早期绑定,但它仍然是有帮助的,因为我然后意识到Excel无法与后期绑定VBA代码(在机器A上)!

VBScript也发生了一些奇怪的事情。 当我第一次写脚本时,他们默认运行(单击Windows资源pipe理器中的文件),但是没有明显的原因,他们停止工作。 我发现我需要指定32位版本(C:\ WINDOWS \ SysWOW64 \ cscript.exe)的完整path才能工作。

另外值得注意的是,通过使用cscript.exe而不是wscript.exe ,embedded在我的Python模块中的debugging信息出现在Windows CMD窗口中。

下一个突破是通过使用Dependency Walker程序depends.exe 。 这在像我这样的post中经常被提到,人们正在试图弄清楚DLL为什么不起作用。

Dependency Walker可以从它自己的网站上下载,但是这个版本在Windows 7下无法正常工作(请参阅在Windows 7 x64上挂载Dependency Walker的分析x86可执行文件 ),所以我发现我需要安装WDK 8.1(从这里http:/ /msdn.microsoft.com/en-US/windows/hardware/gg454513 )。

DW起初非常强大,有点压倒性。 但是,通过阅读它的日志logging输出,很明显Excel 2007使用msvcr80.dll,并且服务器加载msvcr90.dll的尝试失败(即使DLL已正确安装在计算机上)。 这不是计算机B上的问题,因为Excel 2013使用msvcr90.dll。

现在,在这些testing中,我使用Python的comtypes以交互方式创build服务器(没有涉及服务器DLL)。 但是也有通过使用py2exe工具创buildDLL的可能性。 我也试图这样做,该DLL无法使用regsvr32注册。

DW也帮助debugging了这个问题。 令人高兴的是,在日志输出中,我注意到一个Pythonexception的堆栈跟踪。 这是例子中的GetModule() 。 事实certificate,这个调用只需要一次,以创build一些Python类,然后在机器上caching。 删除这个命令解决了这个问题。

此外,虽然它可能没有引起问题,但官方最新版本的py2exe是0.6.9,但这导致一些不再可用的文件被捆绑(特别是zlib.pyd )。 非官方版本0.6.10(可在这里find: http ://www.lfd.uci.edu/~gohlke/pythonlibs/#py2exe)解决了这个问题。

所以我现在有编译一个COM服务器的DLL的可能性,其中我可以包括所需的msvcr90.dll,是的,它可以在两台机器上工作:-)

总之呢。 Windows 7与32位和64位库的混合是一场噩梦。 VBScript通过为testing服务器提供独立的环境来提供帮助。 Dependency Walker真的很棒,但需要很oleviewer才能学会使用(WDK中其他有用的工具包括oleviewerprocess-monitorprocess-explorer )。