使用由Python扩展的VB来创建COM服务器

ZDNet软件频道 时间:2003-08-20 作者:ZDNet China |  我要评论()
本文关键词:
Python领先于其他大多数脚本语言的优势是其同各种操作系统的紧密集成能力,这就使得Python能够使用各种系统服务。我今天所要讨论的系统服务是COM。
本文译自Builder.com,未经许可请勿转载 Python领先于其他大多数脚本语言的优势是其同各种操作系统的紧密集成能力,这就使得Python能够使用各种系统服务。我今天所要讨论的系统服务是COM。

有了Python,你就可以使用COM服务器,例如微软的XML剖析器,或者你可以创建COM服务器。具有了创建COM服务器的能力,你就能够从根本上扩展脚本语言或者Windows应用程序的丰富性。

方法

同使用ATL创建相当的对象相比,使用Python来创建COM服务器简直是太简单了。首先,你要创建一个普通的Python类。然后,你需要向这个类添加一个数值字段,这个类会公开方法和属性,并为辨别COM的对象。

你需要定义三个强制字段。第一个字段是_public_methods_。_public_methods_列出了你希望在这个类里公开的方法。

第二个字段是一个叫做_reg_progid_的友好类(friendly class),它包含一个带有类名称的字符串,而CreateObject会使用它。例如,如果我们对_reg_progid_使用“Extractor.Extract”,那么在VBScript里,我们就会使用CreateObject:

set extractor = CreateObject("Extractor.Extract")

第三个要定义的字段是_reg_clsid_。这是这样一个字符串,它包含用于这个类的唯一GUID。在Python里,你可以使用pythoncom.CreateGuid()来生成GUID。我创建GUID的一个简单捷径是使用Python控制台,将其复制和粘贴进类里。

下面是一个完整的Python COM服务器。

classURLExtractor:
              _public_methods = ["extract"]
              _reg_progid_ = "URLExtractor.Extractor"
              _reg_clsid_ = ""
              def extract(self, strHTML):
                            #URLExtractor is defined elsewhere
                            parser = URLExtractor()
                            parser.feed(strHTML)
                            parser.close()
                            return parser.getAnchors()


为了完成这个类,我们需要在COM系统里注册它。在理想状况下,你希望你的COM服务器能够自己注册,而且你希望这个注册过程越简单越好。对于这个类来说,我们将做到这一步,即你所要做的只是运行这个脚本,它就会自己注册了。

if __name__ == "__main__":
               import win32com.server.register
               try:
                            win32com.server.register.UseCommandLine(URLExtractor)
                            print "URLExtractor successfully registered"
               except:
                            print "URLExtractor failed to register"


能够轻易迅速地创建COM服务器将是提高生产力的巨大动力。你可以像使用其他任何COM对象一样使用它。例如,你可以创建一个同ASP一起使用的COM服务器,并将Python的强大能力同ASP结合起来。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134