Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将方法添加到COM接口_C++_Visual Studio 2008 - Fatal编程技术网

C++ 将方法添加到COM接口

C++ 将方法添加到COM接口,c++,visual-studio-2008,C++,Visual Studio 2008,我用VS2008创建了一个ATL COM dll工作区。它已生成MyCom.idl接口。它是否提供了向该接口添加方法的简单方法?如果您在“类”视图中展开idl,右键单击特定类和“添加方法”或“添加属性”,则应该有一个选项,这将引导您通过一个小向导将方法添加到您的接口和相关实现中。是,这样做是有选择的 如果没有向导,要做到这一点并不难。我了解到添加COM接口方法很困难,因为我懒得去查找它,所以我仔细研究了其他COM接口,并尝试添加属性、方法等 首先,使用向导时有两个缺点,尤其是在编辑现有COM接口

我用VS2008创建了一个ATL COM dll工作区。它已生成MyCom.idl接口。它是否提供了向该接口添加方法的简单方法?

如果您在“类”视图中展开idl,右键单击特定类和“添加方法”或“添加属性”,则应该有一个选项,这将引导您通过一个小向导将方法添加到您的接口和相关实现中。

是,这样做是有选择的


如果没有向导,要做到这一点并不难。我了解到添加COM接口方法很困难,因为我懒得去查找它,所以我仔细研究了其他COM接口,并尝试添加属性、方法等

首先,使用向导时有两个缺点,尤其是在编辑现有COM接口时。首先,它很慢,特别是如果您有一个有几十个接口的大型组件。我坐在一个相当不错的工作站前,打开向导,完成两到三个步骤要比手动将方法添加到IDL、.h和.cpp文件中花费更长的时间

第二个是,当使用不同的VisualStudio和不同的向导版本时,会产生C++污垢,比如多个公开声明,而不需要任何类似的东西。但是,我建议您像向导一样操作,以便在下一个程序员再次使用向导时不会进一步混淆它-这将增加混淆,最终导致文件大小增加、类声明不可读和编译时间延长。只需在向导执行的相同位置插入相同类型的方法或宏即可

也许你会发现我很久以前发现的有用的东西。您可以在文章“”中找到更多详细信息,这篇文章相当古老,但提供了基本的基础知识,但我在这里将不再提及

IDL文件保存组件将导出的所有接口定义。因此,如果你想添加一个方法,你需要找到相应的接口定义,它是由“interface”关键字和一个通常以大写字母I开头的名称引入的。接口前面有一些由[and]包围的注释,为了简单起见,我将不解释这些注释。使用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]也是可能的,因此参数的结果应该写入组件内的相同内存地址,以便可以轻松地将其传递回调用方。还要注意,“real”返回值应该是HRESULT句柄,它将指示方法的成功或失败

现在让我们看一下C++头。我想你会自己找到正确的文件和位置

STDMETHOD(DoSomething)(/*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal);
STDMETHOD宏负责结果值HRESULT和calltype。此处的注释无效,但为了澄清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宏非常重要。假设上面示例中的值是通过提示用户确定的。在报纸上读到它

理解IDL机制将有助于您在出现错误时尽快解决问题,这些错误不一定是指逻辑中的问题,而是指接口。它还将允许您了解界面的实际功能,这将帮助您避免使用向导时出现错误,因此我鼓励任何人至少阅读一些有关它的基本信息