我想使用win32com扩展来实现python com服务器.然后从.NET中使用服务器.我使用以下示例来实现com服务器并且它运行没有问题但是当我尝试使用C#消耗它时,我得到了FileNotFoundException并带有以下消息"使用CLSID检索组件的COM类工厂{676E38A6-7FA7-4BFF-9179 -AE959734DEBB}由于以下错误而失败:8007007e." .我也发布了C#代码.我想知道我是否遗漏了一些我会感激任何帮助.
谢谢,莎拉
#PythonCOMServer.py import pythoncom class PythonUtilities: _public_methods_ = [ 'SplitString' ] _reg_progid_ = "PythonDemos.Utilities" # NEVER copy the following ID # Use"print pythoncom.CreateGuid()" to make a new one. _reg_clsid_ = pythoncom.CreateGuid() print _reg_clsid_ 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__': print 'Registering Com Server' import win32com.server.register win32com.server.register.UseCommandLine(PythonUtilities) // the C# code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Type pythonServer; object pythonObject; pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities"); pythonObject = Activator.CreateInstance(pythonServer); } } }
rob.. 10
COM服务器只是一个软件(DLL或可执行文件),它将通过定义的协议接受远程过程调用(RPC).协议的一部分说服务器必须具有唯一的ID,存储在Windows的注册表中.在我们的例子中,这意味着您已"注册"了不存在的服务器.因此错误(未找到组件).
所以,它应该是这样的(像往常一样,这是未经测试的代码!):
import pythoncom class HelloWorld: _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}" _reg_desc_ = "Python Test COM Server" _reg_progid_ = "Python.TestServer" _public_methods_ = ['Hello'] _public_attrs_ = ['softspace', 'noCalls'] _readonly_attrs_ = ['noCalls'] def __init__(self): self.softspace = 1 self.noCalls = 0 def Hello(self, who): self.noCalls = self.noCalls + 1 # insert "softspace" number of spaces return "Hello" + " " * self.softspace + str(who) if __name__ == '__main__': if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]: import win32com.server.register win32com.server.register.UseCommandLine(HelloWorld) else: # start the server. from win32com.server import localserver localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')
然后你应该从命令行运行(假设脚本名为HelloWorldCOM.py):
HelloWorldCOM.py --register HelloWorldCOM.py
HelloWorld类是服务器的实际实现.它暴露了一个方法(Hello)和一些属性,其中一个是只读的.使用第一个命令,注册服务器; 使用第二个,运行它然后它可以从其他应用程序使用.
COM服务器只是一个软件(DLL或可执行文件),它将通过定义的协议接受远程过程调用(RPC).协议的一部分说服务器必须具有唯一的ID,存储在Windows的注册表中.在我们的例子中,这意味着您已"注册"了不存在的服务器.因此错误(未找到组件).
所以,它应该是这样的(像往常一样,这是未经测试的代码!):
import pythoncom class HelloWorld: _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}" _reg_desc_ = "Python Test COM Server" _reg_progid_ = "Python.TestServer" _public_methods_ = ['Hello'] _public_attrs_ = ['softspace', 'noCalls'] _readonly_attrs_ = ['noCalls'] def __init__(self): self.softspace = 1 self.noCalls = 0 def Hello(self, who): self.noCalls = self.noCalls + 1 # insert "softspace" number of spaces return "Hello" + " " * self.softspace + str(who) if __name__ == '__main__': if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]: import win32com.server.register win32com.server.register.UseCommandLine(HelloWorld) else: # start the server. from win32com.server import localserver localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')
然后你应该从命令行运行(假设脚本名为HelloWorldCOM.py):
HelloWorldCOM.py --register HelloWorldCOM.py
HelloWorld类是服务器的实际实现.它暴露了一个方法(Hello)和一些属性,其中一个是只读的.使用第一个命令,注册服务器; 使用第二个,运行它然后它可以从其他应用程序使用.