如果我使用Visual Studio(2015)中的OLE / COM对象查看器(oleview.exe)从Excel可执行文件(来自MSO 2007)显示(生成)IDL,我看到很多接口中有很多方法LCID参数。
例如,_Application接口的Volatile()方法。 oleview生成的IDL看起来像:
HRESULT Volatile([in, optional] VARIANT Volatile,
[in, lcid] long lcid);
(另外,可选参数如何跟随非可选参数?)
如果我使用Win32 API(LoadTypeLibEx(),ITypeLib,ITypeInfo等)来检查相同的Excel可执行文件作为类型库,我根本看不到这些参数。如果我根据ITypeInfo方法告诉我的方式生成相应的C ++声明,那就是:
HRESULT Volatile(VARIANT Volatile);
我没有在Word类型库中看到相应的怪异(它不在Word可执行文件中,而是在单独的msword.olb文件中)。至少不是那些在调查这些东西时从一开始就遇到的接口,即_Application and Document。
发生了什么事?
答案 0 :(得分:0)
我明白了:我所看到的是_Application接口是一个所谓的双接口。见https://msdn.microsoft.com/en-us/library/windows/desktop/ms686592(v=vs.85).aspx。它的TYPEATTR在其wTypeFlags中设置了TYPEFLAG_FDUAL位。
这意味着有一个相应的" vtable-based"接口,您可以通过在返回的HREFTYPE上调用GetRefTypeOfImplType(-1)然后调用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的接口之间参数的类型和数量上存在更大的差异。