Any ideas?

On Tue, Jan 28, 2020 at 1:06 PM Terry Davis <terry.y.da...@gmail.com> wrote:

> 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