我有一个COM dll,使用COM Inter-op的.NET应用程序会使用它。
在CoClass中的一个中,有一个名为IT6TrackData的接口(interface),它有一个名为TrackData的get属性。
从IDL文件:
Interface IT6TrackData
{
[propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal);
}
在上面的IDL文件中查看TLB文件时,该属性显示为trackData(小写的t)
由于某种原因,客户端应用程序将此属性称为trackData,并且到目前为止一切正常。
作为增强功能的一部分,上述接口(interface)已升级为具有put属性
Interface IT6TrackData
{
[propget, id(1)] HRESULT TrackData([out, retval] SAFEARRAY(BYTE) *pVal);
[propput, id(1)] HRESULT TrackData([in]SAFEARRAY(BYTE) pVal);
}
现在,当在TLB文件中查看上述IDL文件时,它显示的属性为TrackData(t为大写),这破坏了旧的.NET客户端,这些客户端继续引用该.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的副作用。它有一种变通方法,可以解决由不区分大小写的语言引起的麻烦。可能在一个 shell 中声明类型,但在另一个 shell 中其他地方引用它。 Visual Basic是这种语言的主要示例。
hack非常粗糙,它采用遇到的第一个标识符的大小写,然后更改任何后续标识符的大小写以进行匹配。意外更改大小写的最典型原因是参数名称,通常以小写的首字母拼写。因此,您可能在先前版本的代码中有一个“trackData”方法参数。
在您的修订版中,标识符的顺序已更改,或者您已重命名或删除了该参数。现在改为获取“TrackData”。
如果周围有现有的客户代码(取决于原始大小写),那么您无能为力,只能在源代码中更改大小写。麻烦修复,但对您的客户来说并不奇怪,因为他们无法分辨出差异:)