我用VS2008创建了一个ATL COM dll工作区。它生成了MyCom.idl接口。它是否提供了向该界面添加方法的简单方法?
答案 0 :(得分:4)
是的,可以选择这样做。
答案 1 :(得分:2)
如果您在类视图中展开idl以右键单击特定类并添加'add method'或'add property',则会有一个选项,它会引导您完成一个小向导,将该方法添加到您的界面和您的界面相关实施。
答案 2 :(得分:2)
没有巫师就没那么难。我学会了很难添加COM接口方法,因为我懒得在MSDN查找它,所以我仔细查看了其他COM接口,并通过添加属性,方法等进行了实验。
首先,使用向导时存在两个缺点,尤其是在编辑现有COM接口时。首先它很慢,特别是如果你有一个带有几十个接口的大型组件。我坐在一个相当不错的工作站前面并打开向导,完成两到三个步骤比手动将方法添加到IDL,.h和.cpp文件要花费更长的时间。
其次,当使用不同的Visual Studio并因此使用不同的向导版本时,会产生像多个公共语句一样的c ++污垢,而不需要任何东西。但是我建议你像向导一样,以便在下一个程序员再次使用向导时不要进一步混淆 - 这会增加混淆,最终导致文件大小增加,类声明不可读,编译时间更长。只需在向导所在的相同位置插入相同类型的方法或宏。
所以也许你可能会觉得我发现这么久很有用。您可以在文章“Understanding IDL”中找到更多详细信息,这篇文章相当陈旧,但提供了必要的基础知识,但我不会在此提及。
IDL文件包含组件将导出的所有接口定义。因此,如果你想添加一个方法,你需要找到由“interface”关键字引入的相应接口定义和一个通常以大写字母I开头的名称。接口前面有一些注释被[和]包围,其中我不会为了简单起见而解释。使用Visual Studio时,IDL关键字将正确突出显示。这就是典型界面的外观:
[
object,
uuid(0B2499FA-0D73-488C-B961-03FB8327485C),
dual, helpstring("IMyInterface Interface"),
pointer_default(unique)
]
interface IMyInterface : IDispatch {
// ... methods and properties
};
现在让我们假设IMyInterface只包含一个方法,并且您想要添加类似的第二个方法:
[id(1), EXCLUDE_FROM_HELP] HRESULT DoSomething([in] long newVal, [out, retval] long* pRetVal);
同样在[]括号内有注释。添加新方法时会增加id注释值。在参数前面还有输入参数的[in]注释,[out]用于包含方法结果的参数。如果只有一个结果,您可能希望使用将结果用作返回值的方法。然后使用[out,retval]注释。
因此,当添加这样的方法时,复制上面的行,增加ID并更改方法名称并相应地调整参数。
请注意,[out]参数始终必须是指针。这有几个原因,最明显的原因是[in,out]也是可能的,因此参数的结果应写入组件内的相同内存地址,以便可以将其传递回调用者容易。另请注意,“实际”返回值应该是HRESULT句柄,它将指示方法的成功或失败。
现在让我们看一下C ++标题。我假设你会找到正确的文件并自己放置。
STDMETHOD(DoSomething)(/*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal);
STDMETHOD宏负责处理HRESULT和calltype的结果值。这些annoations在这里无效,但为了澄清IDL文件中的预期用法,它们被添加为注释。这些评论是可选的。请小心使用与IDL文件内部相同的数据类型。
STDMETHODIMP CMyClass::DoSomething( /*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
long result = GetTheResultValueFromSomewhere();
*pRetVal = result;
return S_OK;
}
STDMETHODIMP是一个与标题不同的宏。基本上它也是这样做的。如果要在MFC对话框中使用资源,则重要的是AFX_MANAGE_STATE宏。想象一下,上面例子中的值是通过提示用户来确定的。请在Technical Tips blog post。
中了解相关信息了解IDL机制将在发生错误时帮助您,这些错误不一定是指逻辑中的问题,而是界面。它还允许您了解界面实际执行的操作,这将帮助您在使用向导时解决错误,因此我鼓励任何人至少阅读有关它的一些基本信息。