从获取文档对象时文字应用对象时,其成员不会从gencache缓存中填充,而VBSEdit可以获取它们

2024-09-21 03:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

https://mail.python.org/pipermail/python-win32/2004-October/002582.html完美地总结了我的问题(只需稍作修改就可以针对我的案例进行更新):

I would like to have a Word Document instance with all methods and properties visible during interactive session. This is my currnet apporach:

>>> from win32com.client import gencache, Dispatch
>>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 1, bForDemand=True) 
<module 'win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x1' from
'C:\DOCUME~1\osuchw\LOCALS~1\Temp\gen_py\2.3\00020905-0000-0000-C000-000000000046x0x8x1\__init__.py'>
>>> word = Dispatch('Word.Application')
>>> word 
<win32com.gen_py.Microsoft Word 12.0 Object Library._Application instance at 0x18074720>
>>> doc = word.Documents.Add()
>>> doc 
<win32com.gen_py.None.Document>

As you can see I am getting a dynamic object not knowing its methods/properties. What I would like to get is something like:

>>> doc = Dispatch('Word.Document')
>>> doc 
<win32com.gen_py.Microsoft Word 12.0 Object Library._Document instance at 0x37038040>

我想我还需要从另一个类型库(例如,有“office12.0对象库”)生成一个包装器,但是没有任何提示。同样,在HKEY_CLASSES_ROOT\CLSID\{00020906-0000-0000-C000-000000000046}处没有TypeLib子键,doc.CLSID就是这样产生的。在

这个线程中唯一的答案指向RTFM一本关于Word编程的普通书籍,没有任何提示(我严重怀疑它甚至提到typelibs)。在

最后,我用以下代码为机器上的所有类型库生成包装器:

import win32com.client.selecttlb    
ii=win32com.client.selecttlb.EnumTlbs()
ii=[i.desc for i in ii]
# one typelib - "Visual Basic runtime objects and procedures [6.0]" - produced an error
for i in ii: subprocess.call(['python','-m','win32com.client.makepy',i])

但即使在这种情况下,它仍然是win32com.gen_py.None.Document。在


最奇怪的是对象的类被识别并存在于缓存中:

^{pr2}$

同时,VBA编辑器和VBSEdit列表w.ActiveDocument的成员都很好。他们是怎么做到的,为什么pythoncom不能这样做?在


Tags: toinstancepyclientdocdocumentlikewin32com

热门问题