Update 2: After discovering the `pythoncom.GetRecordFromGuids` and
`.GetRecordFromTypeInfo` (with the comment: "This function will fail if the
specified type info does not have a guid defined").

I found that the Record types don't appear to have a GUID.
lib_pyITypelib.GetDocumentation(4) = ('SoftwareInfo', None, 0, None)
lib_pyITypelib.GetTypeInfo(4).GetTypeAttr().iid
= IID('{00000000-0000-0000-0000-000000000000}')

So, is it possible to create a Record object without a GUID?
(Assuming that passing a Record object `ccs.GetSoftwareInfo(info=<some
Record Object>)` is the correct approach here.)

I also tried assigning a `pythoncom.CreateGuid() to the `iid` attribute
above, but `GetRecordFromGuids` failed with `pywintypes.com_error:
(-2147319765, 'Element not found.', None, None)`. So I assume the GUID
assignment didn't make it outside of python into COM-space.

P.S.
I also found this old thread:
https://grokbase.com/t/python/python-win32/0821b2n4e5/how-to-create-a-com-record
which appears to be related to my problem, but no solutions were identified.
(I tried the `DumbDispatch` solution; it didn't work).


On Mon, Jan 27, 2020 at 4:31 PM Terry Davis <terry.y.da...@gmail.com> wrote:

> Update: The functions that don't work return Record types, and the ones
> that do work just return multiple values (a tuple).
> Do I need to pass in the appropriate Record type (or an empty record)
> during each function call?
> If so, how do I get to the Record types that I see in the python object
> browser (python -m win32com.client.combrowse)?
>
> Thanks,
> Terry
>
> On Mon, Jan 27, 2020 at 3:33 PM Terry Davis <terry.y.da...@gmail.com>
> wrote:
>
>> Hi all,
>>
>> I tried searching the mailing list archives for "com_record" but didn't
>> find anything relevant.
>>
>> For context, I'm trying to access a COM interface defined in a .tlb file.
>>
>> Here's a skeleton of the script I'm using to expose this interface:
>> import pythoncom
>> from win32com.client import gencache
>>
>> lib_GUID = "{<GUID>}"
>> lib_major = 1
>> lib_minor = 0
>> lib_pyITypelib = pythoncom.LoadRegTypeLib(lib_GUID, lib_major, lib_minor)
>> lib = gencache.EnsureModuleForTypelibInterface(_lib_pyITypelib)
>>
>> ccs = lib.CControlServer()  # CControlServer is a CoClass
>> eid, *other = ccs.LoadExperiment(**path to file**)  # Works
>> ccs.GetSoftwareInfo()  # Fails with exception below.
>> ccs.GetSolvent(eid)  # also fails
>>
>> I can't dig down in the debugger to find the source of the exception, so
>> I'm hoping someone here can help!
>>
>>
>> Exception:
>>
>> def GetSoftwareInfo(self, info=pythoncom.Missing):
>>
>>
>> <ipython-input-8-7304ad54d54a> in <module>
>> ----> 1 ccs.GetSoftwareInfo()
>>
>> ~\AppData\Local\Temp\gen_py\3.7\<GUID>x0x1x0.py in GetSoftwareInfo(self,
>> info)
>>     279         def GetSoftwareInfo(self, info=pythoncom.Missing):
>>     280                 'method GetSoftwareInfo'
>> --> 281                 return self._ApplyTypes_(13, 1, (24, 0), ((36,
>> 2),), 'GetSoftwareInfo', None,info
>>     282                         )
>>     283
>>
>> C:\Python37\lib\site-packages\win32com\client\__init__.py in
>> _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID,
>> *args)
>>     465         def _ApplyTypes_(self, dispid, wFlags, retType, argTypes,
>> user, resultCLSID, *args):
>>     466                 return self._get_good_object_(
>> --> 467                         self._oleobj_.InvokeTypes(dispid, 0,
>> wFlags, retType, argTypes, *args),
>>     468                         user, resultCLSID)
>>     469
>>
>> TypeError: Only com_record objects can be used as records
>>
>
_______________________________________________
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32

Reply via email to