其他分享
首页 > 其他分享> > c – MIDL更改接口名称

c – MIDL更改接口名称

作者:互联网

我有一个COM DLL,使用COM Inter-op的.NET应用程序使用它.
在其中一个CoClasses中,有一个名为IT6TrackData的接口,它有一个名为TrackData的get属性

从IDL文件:

Interface IT6TrackData
{
   [propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal);
}

当查看上述IDL文件的TLB文件时,它将该属性显示为trackData(t为小写)
出于某种原因,客户端应用程序将此属性称为trackData,并且一切正常,直到现在.

作为增强功能的一部分,上面的接口已升级为具有put属性

Interface IT6TrackData
{
   [propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal);
   [propput, id(1)] HRESULT TrackData([in]SAFEARRAY(BYTE) pVal);
}

现在,当查看上述IDL文件的TLB文件时,它将该属性显示为TrackData(t为大写),这打破了继续引用的旧.NET客户端
trackData,小写“t”.

我已经阅读了这篇知识库文章
http://support2.microsoft.com/kb/220137/en-gb

但有没有出路,有没有人知道这个问题的解决方案.

感谢您的关注.

IDL文件

import "oaidl.idl";
import "ocidl.idl";

 [
   object,
   uuid(72867CE8-41B6-459E-A258-C7A162A26D5E),
   dual,
   nonextensible,
   helpstring("ITFST6TrackData Interface"),
   pointer_default(unique)
 ]
 interface ITFST6TrackData : IDispatch{
   [propget, id(1), helpstring("property TrackData")] HRESULT TrackData([out, retval]   SAFEARRAY(BYTE) *pVal);
   [propput, id(1), helpstring("property TrackData")] HRESULT TrackData([in]SAFEARRAY(BYTE) pVal);
};
[
   uuid(1D7ABC17-2738-4373-9B6B-239E344DBD21),
   version(1.0),
   helpstring("SampleCom 1.0 Type Library")
]
library SampleComLib
{
   importlib("stdole2.tlb");
   [
       uuid(2013CC98-47A7-468F-912A-2A2CAE25E327),
       helpstring("TFST6TrackData Class")
   ]
   coclass TFST6TrackData
   {
        [default] interface ITFST6TrackData;
   };
};

解决方法:

这是Windows内置的类型库生成器中的hack的副作用.它有针对由不区分大小写的语言引起的麻烦的解决方法.可以在一个套管中声明一种类型,但在另一个套管中的其他地方引用它. Visual Basic是这种语言的主要例子.

黑客非常粗暴,它需要遇到的第一个标识符的大小写,然后更改任何后续标识符的大小以匹配.意外更换套管的最典型原因是参数的名称,通常拼写为小写首字母.所以你可能在以前版本的代码中有一个“trackData”方法参数.

在您的修订版中,标识符的顺序已更改,或者您重命名或删除了该参数.现在获得“TrackData”.

如果您现有的客户端代码取决于原始外壳,那么您可以做的很少,但更改源中的外壳.很难修复,但对你的客户来说并不奇怪,因为他们无法区分:)

标签:atl,c,com,midl
来源: https://codeday.me/bug/20190830/1768044.html