创建免注册的python COM组件

创建免注册的python COM组件,python,com,win32com,pythoncom,registration-free-com,Python,Com,Win32com,Pythoncom,Registration Free Com,我一直试图理解COM库,但我仍然感到困惑。如果我想让python对象com可见,我能找到的唯一指令就是制作一个python脚本,该脚本设置一个com服务器,该服务器被调用并用于按名称生成类实例。IIUC,这是通过永久性地向注册表添加一些信息来实现的,这些信息将CLSID链接到myserver.py文件的路径;下面是一个最起码的例子: 类HelloWorld: #pythoncom.CreateGuid() _reg_clsid_u3;=“{7CC9F362-486D-11D1-BB48-0000

我一直试图理解COM库,但我仍然感到困惑。如果我想让python对象com可见,我能找到的唯一指令就是制作一个python脚本,该脚本设置一个com服务器,该服务器被调用并用于按名称生成类实例。IIUC,这是通过永久性地向注册表添加一些信息来实现的,这些信息将CLSID链接到my
server.py
文件的路径;下面是一个最起码的例子:

类HelloWorld:
#pythoncom.CreateGuid()
_reg_clsid_u3;=“{7CC9F362-486D-11D1-BB48-0000E838A65F}”
_reg_desc=“Python测试COM服务器”
_reg\u progid=“PythonTestServer.HelloWorld”
_公共方法
_公共属性=[“软空间”、“noCalls”]
_只读属性=[“noCalls”]
定义初始化(自):
self.softspace=1
self.noCalls=0
def你好(赛尔夫,谁):
self.noCalls=self.noCalls+1
#插入“softspace”空格数
返回“Hello”+“”*self.softspace+str(who)
如果uuu name uuu==“uuuu main”:#运行一次以注册COM类
导入win32com.server.register
win32com.server.register.UseCommandLine(HelloWorld)#这是我想要避免的
被称为:

Dim a as Object=CreateObject(“PythonTestServer.HelloWorld”)'后期绑定
a、 软空间=10
?a.Hello(“世界”)打印“Hello World”
然而,我确信在过去我下载了一些file.dll,我可以添加它们作为对COM客户端项目(VBA)的引用,并且我从不调用--register/regsrvr/etc。我假设dll包含在运行时修改和恢复注册表更改所需的所有信息。我可以使用早绑定或晚绑定来创建类实例。如果引用的dll包含类型库,我甚至可以获得intellisense


后一种方法感觉更简单,更便于携带。有没有一种方法可以在python中模拟这种情况?

您可以查看免注册COM,但我怀疑它是否有效。我已经获得了免费注册的COM,可以让Python作为客户机工作,但从未尝试过让Python作为服务器。作为服务器,我怀疑它是否适用于Python的原因是Python向CLSID键添加了几个特定于Python的键,并且清单模式中没有可用于保存此信息的元素或属性。简而言之,我认为Python需要从注册表中读取这些信息,才能知道要运行哪个脚本来创建对象,而它不能在清单中。@JosephWillcoxson这是什么意思?我在注册表中看到一些条目;即
HKCR\{progid}\CLSID
-使其COM可见,
HKCR\AppID\{CLSID}
-设置一些安全权限和
HKCR\CLSID\{CLSID}
-其中包含pythoncom服务器dll上的信息和my server.py的位置;我猜这最后一个就是你们所说的,并没有标准的方法通过清单注册这些信息?考虑到我的python脚本没有COM依赖关系可担心,没有清单是很困难的吗?IDK。你必须深入研究代码,看看是否可能。python37.dll中可能有一些导出的函数(或您拥有的任何版本),可以从脚本创建一个对象以传递给客户端。我只是随便从这里的问题中挖掘了Python COM的内容。我对C++和com了解得更多。