I have a Python 3.7, 32 bit, COM server and am calling it from 32 bit Office 
2010 in VBA.  I am attempting to pass some COM objects from VBA to Python.  The 
trace collector full output appears below, but I think the key clues are 
several messages like

in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {00000003-0000-0000-C000-000000000046} 
({00000003-0000-0000-C000-000000000046})

and, later,
    rst = fedb.OpenRecordset("foo")
AttributeError: 'PyIDispatch' object has no attribute 'OpenRecordset'

I think this means that the objects passed in have unrecognized types, and 
therefore type-specific methods don't work on them (though it seems odd they 
aren't dynamically dispatched).

What can I do to fix or debug this?

Based on this theory, I used the makepy tool from the GUI to import the DAO 3.6 
library, which I believe defines both types.  But this didn't seem to help.  I 
found some documentation saying to use win32com.client.Dispatch to get the 
right interface--it also mentioned that the IDispatch object would only repond 
to the 2 methods it knows--but I don't know how.  All the examples I've seen 
with Dispatch use it to create a new object.  I can't find any documentation on 
it (as opposed to tutorials illustratin it use); I think 
com\win32com\client\__init__.py has the relevant definition in the source code, 
but it is not apparent to me whether handing it an IDispatch object rather 
"Company.Class" will cause the  appropriate object to be created.

Running on 64 bit Win 7, with quite a few installations of versions of Python 
floating around.  Using a LocalServer because of earlier problems with in 
process servers.  In particular, the invoking path in the registry for my class 
is 
C:\PROGRA~2\PYTHON~1\pythonw.exe 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\localserver.py"
even though I just installed pywin32 and it said it was putting things under 
"c:\Program Files (x86)".  Both locations (with suitable additions to the 
Program Files path) have localserver.py
--------------------------------------------------- test code in VBA 
----------------------------------------

Public Function medium()
    Dim srv As Object
    Set srv = CreateObject("Fahy.BST")
    medium = srv.Barney(DBEngine.Workspaces(0), CurrentDb())
End Function
---------------------------------------------------------------------

------------------------ python server code BSTImport.py 
---------------------------
import atexit, csv, sys
import pythoncom, win32com.client
from win32com.server.exception import COMException
from win32com.client import constants
from win32com.server.register import UseCommandLine

TmpTable = "aatmpt_bst"  # table to import csv into
#pdb.set_trace()
# fields in csv file I use now are
# 'Sample Barcode', 'Participant ID', 'Initials', 'Visit ID',
# 'Collection Date', 'Sample Type', 'Site Comment',
# 'Shipment Comment', 'Shipment ID

# BST Import already name of form in VB
class BSTImport:
    # COM Support
    _public_methods_ = ['Fred', 'Barney']

    _reg_clsid_ = "{050321C2-9B99-4CD0-B5E9-B636DFD94C4D}"
    _reg_desc_ = "BST Test Com Server in Python 32 bit"
    _reg_progid_ = "Fahy.BST"
    # for unknown reasons the inprocess server isn't working
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER

    def Barney(self, ws, fedb):
        """ws is the workspace with which a transaction has already been  
initiated
        fedb is  the database used by the frontend"""
        rst = fedb.OpenRecordset("foo")
        rst.AddNew()
        fld = rst("foolish")
        fld.Value = "python.Barney"
        rst.Update()
        rst.Close()
        rst = None
        return True
    # other methods omitted

if __name__ == "__main__":
    UseCommandLine(BSTImport)
-------------------------------------------------------------------------------------------

--------------------------------------- trace 
---------------------------------------------

Object with win32trace dispatcher created (object=None)
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {00000003-0000-0000-C000-000000000046} 
({00000003-0000-0000-C000-000000000046})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {0000001B-0000-0000-C000-000000000046} 
({0000001B-0000-0000-C000-000000000046})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {00000018-0000-0000-C000-000000000046} 
({00000018-0000-0000-C000-000000000046})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID b'IExternalConnection' ({00000019-0000-0000-C000-000000000046})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {4C1E39E1-E3E3-4296-AA86-EC938D896E92} 
({4C1E39E1-E3E3-4296-AA86-EC938D896E92})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID b'IPersistStreamInit' ({7FD52380-4E07-101B-AE2D-08002B2EC713})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID b'IPersistPropertyBag' ({37D84F60-42CB-11CE-8135-00AA004BB851})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {1C733A30-2A1C-11CE-ADE5-00AA0044773D} 
({1C733A30-2A1C-11CE-ADE5-00AA0044773D})
in _GetIDsOfNames_ with '('Barney',)' and '1033'

in _Invoke_ with 1001 1033 3 (<PyIDispatch at 0x00B81400 with obj at 
0x00848994>, <PyIDispatch at 0x00B81418 with obj at 0x00848A24>)
Traceback (most recent call last):
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\dispatcher.py",
 line 47, in _Invoke_
    return self.policy._Invoke_(dispid, lcid, wFlags, args)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 586, in _invokeex_
    return func(*args)
  File "C:\Users\rdboylan\Documents\Wk devel\BSTImport.py", line 36, in Barney
    rst = fedb.OpenRecordset("foo")
AttributeError: 'PyIDispatch' object has no attribute 'OpenRecordset'
pythoncom error: Python error invoking COM method.

Traceback (most recent call last):
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\dispatcher.py",
 line 163, in _Invoke_
    return DispatcherBase._Invoke_(self, dispid, lcid, wFlags, args)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\dispatcher.py",
 line 49, in _Invoke_
    return self._HandleException_()
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\dispatcher.py",
 line 47, in _Invoke_
    return self.policy._Invoke_(dispid, lcid, wFlags, args)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File 
"C:\Users\rdboylan\AppData\Roaming\Python\Python37\site-packages\win32com\server\policy.py",
 line 586, in _invokeex_
    return func(*args)
  File "C:\Users\rdboylan\Documents\Wk devel\BSTImport.py", line 36, in Barney
    rst = fedb.OpenRecordset("foo")
AttributeError: 'PyIDispatch' object has no attribute 'OpenRecordset'
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID IProvideClassInfo ({B196B283-BAB4-101A-B69C-00AA00341D07})
in <BSTImport.BSTImport object at 0x009F62F0>._QueryInterface_ with unsupported 
IID {CACC1E85-622B-11D2-AA78-00C04F9901D2} 
({CACC1E85-622B-11D2-AA78-00C04F9901D2})
in _GetTypeInfo_ with index=0, lcid=1033

in _GetTypeInfo_ with index=0, lcid=0
-------------------------------------------------------------------------------------------------
_______________________________________________
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32

Reply via email to