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 <[email protected]> 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 <[email protected]>
> 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
[email protected]
https://mail.python.org/mailman/listinfo/python-win32