【发布时间】:2013-02-03 14:46:28
【问题描述】:
我最近继承了一个项目,该项目在 DLL 中创建和实现 COM 组件类/接口。该 COM DLL 被应用程序使用,该应用程序将 GUI 应用于 COM 类的接口。这是唯一使用 COM DLL 的应用程序。我是处理 COM 的新手,很难找到好的文档。
我的部分任务涉及向界面添加一些方法/属性(以及删除一些不再需要的)。我了解到我需要修改 IDL 才能完成此操作。现在我只是简单地将我的新方法和属性添加到接口的末尾,一切似乎都很好。但是,当我删除其中一个属性(例如)时,当我运行应用程序时,事情很快就会变糟。
interface IMyComInterface : IDispatch
{
[id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg);
[id(2), helpstring("method CheckFolder")] HRESULT CheckFolder([in] VARIANT Folder, [out] VARIANT *pCount, [out, retval] VARIANT *pErrorCount);
//[propget, id(3), helpstring("property Flags")] HRESULT Flags([out, retval] VARIANT *pVal);
//[propput, id(3), helpstring("property Flags")] HRESULT Flags([in] VARIANT newVal);
[propget, id(4), helpstring("property MessageStore")] HRESULT MessageStore([out, retval] VARIANT *pVal);
[propput, id(4), helpstring("property MessageStore")] HRESULT MessageStore([in] VARIANT newVal);
[propget, id(5), helpstring("property Directory")] HRESULT Directory([out, retval] VARIANT *pVal);
[propput, id(5), helpstring("property Directory")] HRESULT Directory([in] VARIANT newVal);
}
我猜这与分解的 ID 号序列有关。我想我可以把它下面的所有东西都移上来,一切都会奏效。但我很好奇做这一切的正确方法。
非常感谢。
【问题讨论】:
-
Any 32-bit positive integral value can be an id,无论顺序如何。您使用什么库(如果有)来实现 IDispatch 方法?只是为了让墨菲不碍事,让舒尔重建一切,手动删除 .dll、.obj 和 .tlb 以成为舒尔。
-
重新编译 GUI 应用程序(用 C++ 编写)解决了这个问题。我现在知道当
IDispatch::Invoke用于后期绑定时,id 很重要,我没有使用。