【问题标题】:MIDL changes the Interface nameMIDL 更改接口名称
【发布时间】:2014-12-05 19:55:36
【问题描述】:

我有一个 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;
   };
};

【问题讨论】:

  • 您是否尝试过添加第二个界面?是否会出现同样的问题?
  • 即使删除了新添加的 put 属性,它仍然显示为 T(大写)

标签: c++ com atl midl


【解决方案1】:

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

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

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

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

【讨论】:

  • 您能否解释一下“Fugly Fix”,因为我不明白,我所做的是,将 IDL 文件更改为使用小写的 trackData,还更改了 .h 中的函数声明和定义以及.cpp分别和rebuild,用TLB生成COM Inter-op dll,用ILDasm查看,但属性还是大写“TrackData”
  • 呵呵,这样,对。祝你好运狩猎 T 鲨 :)
  • 好吧,我没有运气......我破坏了现有的客户端应用程序,这非常糟糕......我不接受这是微软中的一个错误
  • 你没有给我看。如果您想再看一眼,则必须将 IDL 复制/粘贴到 pastebin 中。
  • 我已经发布了 IDL 文件,早期版本的 COM 组件只有 get 属性,当我调查这个问题时,我发现虽然 IDL 有大写“T”但 Oleview 和 Interop有小写“t”,但在我更改添加 put 属性后,现在 oleview 和 ILDasm 始终显示大写 T 用于两个属性,更改 IDL 文件和函数声明和定义无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多