如果我使用Visual Studio (2015)的OLE/COM对象查看器(oleview.exe)从Excel可执行文件(来自MSO2007)显示(生成) IDL,我看到许多接口中的许多方法都有一个LCID参数。
例如,_Application接口的Volatile()方法。oleview生成的IDL如下所示:
HRESULT Volatile([in, optional] VARIANT Volatile,
[in, lcid] long lcid);(另外,可选参数后面怎么能跟非可选参数呢?)
如果我使用Excel (LoadTypeLibEx()、ITypeLib、ITypeInfo等)来检查同一个Win32可执行文件作为类型库,我根本看不到这些参数。如果我要根据ITypeInfo方法告诉我的内容生成相应的C++声明,它将是:
HRESULT Volatile(VARIANT Volatile);我没有在Word类型库中看到相应的奇怪之处(它不在Word可执行文件中,而是在一个单独的msword.olb文件中)。至少在研究这些东西时,从一开始就会遇到的接口,即_Application和Document,不是这样的。
怎么一回事?
发布于 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的接口之间是否可以有更多,比如在参数类型和数量上更多的实质性差异。
https://stackoverflow.com/questions/49969117
复制相似问题