【发布时间】:2015-01-30 05:49:46
【问题描述】:
我遵循了为 Python comtypes 模块 (http://pythonhosted.org/comtypes/server.html) 提供的文档并构建了一个简单的 COM 服务器。
它似乎工作正常。我可以看到类型库和接口已注册(使用 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
有什么办法可以调试吗?
更多cmets
隧道尽头确实有光。使用 VBScript 的建议很有帮助。以下简短脚本确实有效(提供 COM 服务器工作的独立确认)。
Dim x,ab
Set x = CreateObject("MyTypeLib.MyObject")
ab = x.MyMethod(1, 2)
MsgBox CStr(ab)
但是,VBScript 正在使用后期绑定调用服务器,我试图让早期绑定工作。
所以,我更改了我的 Excel VBA 函数以使用后期绑定和预期的事情,但他们没有。
这是修改后的 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
【问题讨论】:
-
它可以在独立的
VBScript上工作吗? (见MSDN: VBSCript > CreateObject) -
我不知道。我没有 VBScript(那不需要 ASP 服务器吗?)
-
很抱歉,提出一个明确的问题是一项挑战。我在完全不同的位置有两台机器。识别我正在处理的两台机器可能会有所帮助。两者都运行 64 位 Win7,但一个(称为“A”)使用“家庭”版本,另一个(称为“B”)运行 Win7 专业版。在机器 A 上我有 Office 2007 和在 B 上 Office 2013。我安装了完全相同的 Python 版本来在每台机器上创建 COM 服务器,并且所有项目文件都通过云驱动器同步。
-
在机器 B 上,事情开始工作,但后来我在 A 上发现问题仍然存在。我一直在检查注册表项是否引用了最新的类型库。我认为没关系。在机器 A 上使用进程监视器,我可以看到 msvcr90.dll 没有找到(从 PATH 中搜索了一整套不同的文件夹,然后 Excel 悄悄地放弃了)。 DLL 已安装在机器上(我确定运行了 vcredist_x86.exe)。再次使用进程监视器,但使用 VBScript,msvcr90.dll 没有使用。
-
我已经尝试过制作和注册本地服务器。看起来很有希望(但我必须等待在机器 A 上尝试)。有一个解决方案会很好,但与进程内服务器相比,我担心这会增加每个方法调用的开销(并且我的预期应用程序将对性能开销敏感)。我记得看到(在这个传奇的某个时刻)mscvr89.dll 和 mscvr90.dll 加载并并排工作。所以,我想尝试解决这个问题,而不仅仅是避免它。