我想使用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);
}
}
}
答案 0 :(得分: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)和一些属性,其中一个是只读的。 使用第一个命令,注册服务器;使用第二个,运行它然后可以从其他应用程序使用。
答案 1 :(得分:0)
您需要在C#可执行文件上运行Process Monitor以跟踪找不到的文件。