<html><body><div><div>Hi python-win32 community.<br></div><div><br></div><div>I am trying to get this toy COM server (code is below) to work. It is the sample code from <i>"Python Programming for Win32"</i> and adapted for python 3.10. When I test it using VBA in Word, I get this error:<br></div><div>Run-time error '429':<br></div><div>ActiveX component can't create object<br></div><div><br></div><ul><li>I don't know if I am missing one a required <span style="font-family: courier new,monospace, sans-serif;" class="font">_reg_param_ </span>that is needed for Win10.<br></li><li>Is there is an extra step I need to take to register/run the COM server?<br></li><li>I don't know if <span style="font-family: courier new,monospace, sans-serif;" class="font">win32com.server.localserver.serve []</span> is necessary.<br></li><li>Does the class need an <span style="font-family: courier new,monospace, sans-serif;" class="font">__init__ </span>method to do something?</li></ul><div><br></div><div>I appreciate any help or insight into getting this to work. Thank you!<br></div><div>Sincerely, Brian</div><div><br></div><div><b>Context</b>:<br></div><ul><li>Windows 10, python 3.10, Office 365, running python code as Administrator<br></li><li>I have verified the python class works in python only.<br></li><li>I tried registering/unregistering using both options shown below. Both appear to work - no error messages. I can find info about the COM Server using Regedit.<br></li><li>I tried the <span style="font-family: courier new,monospace, sans-serif;" class="font">--debug</span> flag, but it didn't provide any verbosity.<br></li><li>I'm learning COM, but the info about it is sparse and generally very abstract.<br></li></ul><div><br></div><div><b>Python script, SimpleCOMServer.py:</b></div></div><div style="color: #d4d4d4;background-color: #1e1e1e;font-family: CaskaydiaCove Nerd Font, Menlo, Monaco, 'Courier New', monospace, Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span style="color: #ce9178;">"""A sample COM server - almost as small as they come."""</span><br></div><div><span style="color: #6a9955;"># import sys</span><br></div><div><br></div><div><span style="color: #c586c0;">import</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">pythoncom</span><br></div><div><span style="color: #c586c0;">import</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">win32com</span><span style="color: #d4d4d4;">.</span><span style="color: #4ec9b0;">server</span><span style="color: #d4d4d4;">.</span><span style="color: #4ec9b0;">register</span><br></div><div><br></div><div><br></div><div><span style="color: #569cd6;">class</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">PythonUtilities</span><span style="color: #d4d4d4;">:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #ce9178;">"""We expose a simple method in a Python COM object."""</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_clsctx_</span><span style="color: #d4d4d4;"> = </span><span style="color: #4ec9b0;">pythoncom</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">CLSCTX_LOCAL_SERVER</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_public_methods_</span><span style="color: #d4d4d4;"> = [</span><span style="color: #ce9178;">"SplitString"</span><span style="color: #d4d4d4;">]</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_progid_</span><span style="color: #d4d4d4;"> = </span><span style="color: #ce9178;">"PythonDemos.Utilities"</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_desc_</span><span style="color: #d4d4d4;"> = </span><span style="color: #ce9178;">"PythonDemos Test COM Server"</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># NEVER copy the following ID</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># Use "print(pythoncom.CreateGUID())" to made a new on.</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_clsid_</span><span style="color: #d4d4d4;"> = </span><span style="color: #ce9178;">"{819E8336-00B5-4025-979A-46EE1EF411B7}"</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># for Python 3.7+</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># <a rel="noopener noreferrer" href="https://stackoverflow.com/questions/1054849/consuming-python-com-server-from-net">https://stackoverflow.com/questions/1054849/consuming-python-com-server-from-net</a></span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_verprogid_</span><span style="color: #d4d4d4;"> = </span><span style="color: #ce9178;">"PythonDemos.Utilities.1"</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># <filename>.<classname></span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">_reg_class_spec_</span><span style="color: #d4d4d4;"> = </span><span style="color: #ce9178;">"SimpleCOMServer.PythonUtilities"</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">def</span><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">SplitString</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">self</span><span style="color: #d4d4d4;">, </span><span style="color: #9cdcfe;">val</span><span style="color: #d4d4d4;">, </span><span style="color: #9cdcfe;">separator</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">None</span><span style="color: #d4d4d4;">):</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #ce9178;">"""Split a string by a separator."""</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># if separator is not None:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># return val.split(separator)</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># else:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># return val.split()</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">if</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">separator</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">is</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">not</span><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">None</span><span style="color: #d4d4d4;">:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">return</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">str</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">val</span><span style="color: #d4d4d4;">).</span><span style="color: #dcdcaa;">split</span><span style="color: #d4d4d4;">(</span><span style="color: #4ec9b0;">str</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">separator</span><span style="color: #d4d4d4;">))</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">else</span><span style="color: #d4d4d4;">:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">return</span><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">str</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">val</span><span style="color: #d4d4d4;">).</span><span style="color: #dcdcaa;">split</span><span style="color: #d4d4d4;">()</span><br></div><div><br></div><div><br></div><div><span style="color: #6a9955;"># Add code so that when this script is run by python e.e, it self-registers.</span><br></div><div><span style="color: #c586c0;">if</span><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">__name__</span><span style="color: #d4d4d4;"> == </span><span style="color: #ce9178;">"__main__"</span><span style="color: #d4d4d4;">:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">print</span><span style="color: #d4d4d4;">(</span><span style="color: #ce9178;">"Registering COM server..."</span><span style="color: #d4d4d4;">)</span></div><div><span style="color: #d4d4d4;"> </span><span style="color: #4ec9b0;">win32com</span><span style="color: #d4d4d4;">.</span><span style="color: #4ec9b0;">server</span><span style="color: #d4d4d4;">.</span><span style="color: #4ec9b0;">register</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">UseCommandLine</span><span style="color: #d4d4d4;">(</span><span style="color: #4ec9b0;">PythonUtilities</span><span style="color: #d4d4d4;">)</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># if "--register" in sys.argv[1:] or "--unregister" in sys.argv[1:]:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># win32com.server.register.UseCommandLine(PythonUtilities)</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># else:</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># # start the server.</span><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># from win32com.server.localserver import serve</span><br></div><div><br></div><div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;"># serve(["{819E8336-00B5-4025-979A-46EE1EF411B7}"])</span><br></div></div><div><div><br></div><div><b>Word VBA macro:</b><br></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour">Sub TestPython() </span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> Dim PythonUtils As Object</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> Set PythonUtils = CreateObject("PythonDemos.Utilities")</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> response = PythonUtils.SplitString("Hello from VB")</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> For Each Item In response</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> MsgBox Item</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour"> Next</span><span style="color:rgb(0, 0, 0)" class="colour"><br></span></span></span></div><div><span style="font-family: courier new,monospace, sans-serif;" class="font"><span style="font-size: 14px" class="size"><span style="color:rgb(0, 0, 0)" class="colour">End Sub</span></span></span><br></div><div><br></div></body></html>