首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OLE/COM对象查看器输出与编程检查显示的内容不同

OLE/COM对象查看器输出与编程检查显示的内容不同
EN

Stack Overflow用户
提问于 2018-04-23 02:05:45
回答 1查看 535关注 0票数 0

如果我使用Visual Studio (2015)的OLE/COM对象查看器(oleview.exe)从Excel可执行文件(来自MSO2007)显示(生成) IDL,我看到许多接口中的许多方法都有一个LCID参数。

例如,_Application接口的Volatile()方法。oleview生成的IDL如下所示:

代码语言:javascript
复制
HRESULT Volatile([in, optional] VARIANT Volatile, 
                 [in, lcid] long lcid);

(另外,可选参数后面怎么能跟非可选参数呢?)

如果我使用Excel (LoadTypeLibEx()、ITypeLib、ITypeInfo等)来检查同一个Win32可执行文件作为类型库,我根本看不到这些参数。如果我要根据ITypeInfo方法告诉我的内容生成相应的C++声明,它将是:

代码语言:javascript
复制
HRESULT Volatile(VARIANT Volatile);

我没有在Word类型库中看到相应的奇怪之处(它不在Word可执行文件中,而是在一个单独的msword.olb文件中)。至少在研究这些东西时,从一开始就会遇到的接口,即_Application和Document,不是这样的。

怎么一回事?

EN

回答 1

Stack Overflow用户

发布于 2018-04-23 10:17:38

我明白了:我所看到的是因为_Application接口是一个所谓的双接口。参见https://msdn.microsoft.com/en-us/library/windows/desktop/ms686592(v=vs.85).aspx。其类型属性在其wTypeFlags中设置了TYPEFLAG_FDUAL位。

这意味着有一个对应的“基于vtable的”接口,您可以通过调用GetRefTypeOfImplType(-1),然后在返回的HREFTYPE上调用GetRefTypeInfo()来获得该接口的ITypeInfo。参见https://msdn.microsoft.com/en-us/library/windows/desktop/ms221569(v=vs.85).aspx。这是oleview在其生成的IDL中显示的界面。

在这个基于vtable的接口中,Volatile()方法确实有LCID参数。(假设在该参数的PARAMDESC中,wParamFlags将设置PARAMFLAG_FLCID,但尚未进行验证。)

对于在oleview生成的IDL中具有LCID参数的所有其他类似方法,可能也是如此。在基于vtable的接口的类型信息(与返回值的表示方式相关)和参数的列出顺序之间还存在一些其他差异。我还没有检查双接口的基于IDispatch和基于vtable的接口之间是否可以有更多,比如在参数类型和数量上更多的实质性差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49969117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档