使用python编写一个com组件,在python中可以通过win32com.client.Dispatch来创建和调用方法,但是无法使用vb、vba等其他工具访问,错误代码8007007e,错误消息是automation错误,无法创建activex部件。
经过反复研究和网上查找,学习,发现,关键是少了一句话:
_reg_clsctx_ =
pythoncom.CLSCTX_LOCAL_SERVER
分析后,估计是这样:如果不写这句的话,系统会默认使用进程内组件的方式启动,即使用pythoncom27.dll来启动,但是这种方式在我的机器上有问题,写了这句,系统会使用python.exe来启动程序,就没问题了。至于pythoncom27.dll有什么问题,还真是费劲啊。
经过不断的探索,终于发现,这个问题我竟然已经处理过,当时是因为com组件发生R6034错误。那时,系统还能找到msvcr90.dll,只是版本不对,现在,根本找不到msvcr90.dll,用pythoncom27.dll根本启动不了。那么想要python27编写的com组件正常运行,就必须确保系统能找到msvcr90.dll,并且通过manifest指出正确的依赖版本才行。。。似乎我现在成了这个问题的专家了。。。。
那么,这个问题是否只能如此麻烦,如此郁闷呢,非也。如果你出现这个问题,那你一定用的是旧版的pywin32,在pywin32最新版217版中,已经解决了这个问题。它的方法是使用一个pythoncomloader27.dll作为过渡,而这个pythoncomloader27.dll中指明的需要的msvcr90.dll的版本,至此,此问题终于完美解决。
样例如下:
import pythoncom
class PythonUtilities:
_reg_clsctx_
= pythoncom.CLSCTX_LOCAL_SERVER
_public_methods_ = [ 'SplitString' ]
_reg_progid_
= "PythonDemos.Utilities"
# NEVER copy
the following ID
# Use "print
pythoncom.CreateGuid()" to make a new one.
_reg_clsid_
= "{41E24E95-D45A-11D2-852C-204C4F4F5020}"
def
SplitString(self, val, item=None):
import string
if item != None: item = str(item)
return string.split(str(val), item)
# Add code so that when this script is run by
# Python.exe, it self-registers.
if __name__=='__main__':
"Registering COM server"
import
win32com.server.register
win32com.server.register.UseCommandLine(PythonUtilities)