4

我有一个 COM dll ,它由使用 COM 互操作的 .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 客户端继续使用小写“t”引用 trackData .

我已经阅读了这篇知识库文章 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;
   };
};
4

1 回答 1

6

这是 Windows 内置的类型库生成器中的 hack 的副作用。它有一个解决方法来解决由不区分大小写的语言引起的问题。它可能在一个外壳中声明一个类型,但在另一个外壳中的其他地方引用它。Visual Basic 是这种语言的主要例子。

hack 非常粗糙,它采用它遇到的第一个标识符的大小写,然后更改任何后续标识符的大小写以匹配。意外大小写更改的最典型原因是参数名称,通常以小写首字母拼写。因此,您可能在以前版本的代码中有一个“trackData”方法参数。

在您的修订中,标识符的顺序发生了变化,或者您重命名或删除了该参数。现在得到“TrackData”。

如果您的现有客户端代码依赖于原始大小写,那么您几乎无能为力,只能更改源代码中的大小写。Fugly 修复,但对您的客户来说并不令人惊讶,因为他们无法区分:)

于 2014-10-10T17:22:43.873 回答