"DllRegitserServer not found" python_com_server 错误
"DllRegitserServer not found" error for python_com_server
这是我的 com 服务器代码(文件名为 "python_com_server.py"):
import pythoncom, win32com.server.register
import win32traceutil
class Python_COM_Server_4:
_public_methods_ = ['MachineInfo']
_reg_progid_ = "PythonCOMServer_4"
_reg_clsid_ = '{3B4B18D9-BE2C-43A5-B08C-A89B4334DFA1}'
def MachineInfo(self, item=None):
msg = "Your operating system: "
print (msg)
if __name__ == '__main__' or __name__ == 'python_com_server':
win32com.server.register.UseCommandLine (Python_COM_Server_4)
这是我的 setup.py:
from distutils.core import setup
import py2exe
import sys
class Target:
def __init__(self, **kw):
self.__dict__.update(kw)
# for the version info resources (Properties -- Version)
self.version = "0.0.1"
self.company_name = "my company"
self.name = "my com server name"
my_com_server_target = Target(
description = "my com server",
# use module name for win32com exe/dll server
modules = ["python_com_server"],
# specify which type of com server you want (exe and/or dll)
create_exe = True,
create_dll = False
)
setup(
name="my_com_server",
# the following two parameters embed support files within exe/dll file
options={"py2exe": {"bundle_files": 1, }},
zipfile=None,
version="0.0.1",
description="my com server",
# author, maintainer, contact go here:
author="First Last",
author_email="some_name@some_company.com",
# packages=["dir"],
com_server=[my_com_server_target]
)
我运行 在cmd 行上执行以下命令:
python setup.py py2exe
并在 dist 文件夹中生成“python_com_server.exe”。
然后我尝试使用以下方式注册它:
regsvr32 dist\python_com_server.exe
但我收到此错误:
"The module "dist\pythion_com_server.exe" was loaded but the entry-point DllRegisterServer was not found.
我在 windows 服务器 2012 上使用 python 2.7 32 位。
我错过了什么?
为了注册 .exe 的 COM 服务器,而不是使用 RegSvr32.exe,使用 /regserver 参数执行 .exe 本身。
python_com_server.exe /regserver
RegSvr32.exe是注册.dll和.ocx的COM服务器的工具
DllRegisterServer/DllUnregsiterServer 等是它的入口点,COM 服务器 .dll 和 .ocx 必须有它们。
另一方面,.exe的COM服务器必须用自己的代码注册。
由于.exe的COM服务器没有DllRegisterServer/DllUnregsiterServer等,尝试使用RegSvr32.exe注册失败。
比如在VC++的MFC中,是由.exe的InitInstance()中的UpdateRejistry()或UpdateRegistryAll()执行的
在Python的win32com中对应你写的"win32com.server.register.UseCommandLine()"
ctypes有相同的功能,"The main program"中对此Implementing a COM server with ctypes有解释。
这是我的 com 服务器代码(文件名为 "python_com_server.py"):
import pythoncom, win32com.server.register
import win32traceutil
class Python_COM_Server_4:
_public_methods_ = ['MachineInfo']
_reg_progid_ = "PythonCOMServer_4"
_reg_clsid_ = '{3B4B18D9-BE2C-43A5-B08C-A89B4334DFA1}'
def MachineInfo(self, item=None):
msg = "Your operating system: "
print (msg)
if __name__ == '__main__' or __name__ == 'python_com_server':
win32com.server.register.UseCommandLine (Python_COM_Server_4)
这是我的 setup.py:
from distutils.core import setup
import py2exe
import sys
class Target:
def __init__(self, **kw):
self.__dict__.update(kw)
# for the version info resources (Properties -- Version)
self.version = "0.0.1"
self.company_name = "my company"
self.name = "my com server name"
my_com_server_target = Target(
description = "my com server",
# use module name for win32com exe/dll server
modules = ["python_com_server"],
# specify which type of com server you want (exe and/or dll)
create_exe = True,
create_dll = False
)
setup(
name="my_com_server",
# the following two parameters embed support files within exe/dll file
options={"py2exe": {"bundle_files": 1, }},
zipfile=None,
version="0.0.1",
description="my com server",
# author, maintainer, contact go here:
author="First Last",
author_email="some_name@some_company.com",
# packages=["dir"],
com_server=[my_com_server_target]
)
我运行 在cmd 行上执行以下命令:
python setup.py py2exe
并在 dist 文件夹中生成“python_com_server.exe”。
然后我尝试使用以下方式注册它:
regsvr32 dist\python_com_server.exe
但我收到此错误:
"The module "dist\pythion_com_server.exe" was loaded but the entry-point DllRegisterServer was not found.
我在 windows 服务器 2012 上使用 python 2.7 32 位。
我错过了什么?
为了注册 .exe 的 COM 服务器,而不是使用 RegSvr32.exe,使用 /regserver 参数执行 .exe 本身。
python_com_server.exe /regserver
RegSvr32.exe是注册.dll和.ocx的COM服务器的工具
DllRegisterServer/DllUnregsiterServer 等是它的入口点,COM 服务器 .dll 和 .ocx 必须有它们。
另一方面,.exe的COM服务器必须用自己的代码注册。
由于.exe的COM服务器没有DllRegisterServer/DllUnregsiterServer等,尝试使用RegSvr32.exe注册失败。
比如在VC++的MFC中,是由.exe的InitInstance()中的UpdateRejistry()或UpdateRegistryAll()执行的
在Python的win32com中对应你写的"win32com.server.register.UseCommandLine()"
ctypes有相同的功能,"The main program"中对此Implementing a COM server with ctypes有解释。