使用 ATL 的参数类型

Posted

技术标签:

【中文标题】使用 ATL 的参数类型【英文标题】:Parameter types using ATL 【发布时间】:2012-03-07 14:40:50 【问题描述】:

我正在尝试使用 ATL 创建一个非托管 COM dll,它反映了我之前创建的 C# dll。但是,当我向接口添加方法时,我遇到了一个问题并且无法找到解决方案。为了说明,我将包含用 C# 编写的接口:

public unsafe interface IUserIDA

    [DispId(1)]
    void SwitchCriteria(ref double intensity, ref double minMass, ref double maxMass, ref bool selectIntensity, ref long numOfDepCycles);

    [DispId(2)]
    void ChargeStateParam(ref short minCharge, ref short maxCharge, ref bool doChargeState);

    [DispId(3)]
    void InclusionList(ref double intensity, ref double theList, ref short numOfItems);

    [DispId(4)]
    void ExclusionList(ref long exRTWindow, ref double theMassList, ref long theRTList, ref short numOfItems);

    [DispId(5)]
    void OtherCriteria(ref long smartFilterTime, ref double isoExclusionWin, ref double massTolerance, ref bool isPPM);

    [DispId(6)]
    void IsotopeMatchParam(ref double theMassList, ref double theAbundanceList, ref short numOfItems, ref  double abTolerance, ref double maTolerance);

    [DispId(7)]
    void InitIDA();

    [DispId(8)]
    void SurveySpec();

    [DispId(9)]
    void NextScan(double* selectedMasses, double* SelectedIntensities, long* selectedCharges, int itemCount);

当我尝试在我的 ATL 项目(使用 Visual Studio 2008)中重现这一点时,我发现一些数据类型没有列出:布尔类型和整数类型。应该使用什么类型?

【问题讨论】:

或者我遗漏了一些东西,或者它就像这样微不足道:c# 中的布尔值在 c++ 中是 bool,而 c# 中的整数在 c++ 中是 int。真的是你想要的吗? @Flot2011 当我尝试添加方法选项时,有一个用于选择参数类型的菜单,但我没有看到 bool* 或 int* 。有 variant_bool 但认为它的定义不同。 Visual Studio 用的不多,COM 和 ATL 还是第一次用。我当然可以简单地使用 int 或 bool,但由于可能类型列表中的遗漏,我不知道并且担心。 【参考方案1】:

c# 中的 boolean 确实是 C++ 中的 bool,您可以采用这种方式。但是,在标准 COM 接口中,您应该使用 BOOL 或 LONG。 整数同上。使用长。 @Travis 给了你一个很好的建议。在 Visual Studio 中,打开“类视图”窗口(从“视图”菜单中),右键单击您的界面,然后选择“添加”,然后选择“添加方法”或“添加属性”。这将打开一个漂亮的 UI,它将引导您完成 COM 接口的定义。

【讨论】:

谢谢@Uni。这实际上就是我向接口添加方法的方式。我根本找不到任何文献表明它们是否出于某种原因不在参数类型列表中,或者最佳实践是什么。

以上是关于使用 ATL 的参数类型的主要内容,如果未能解决你的问题,请参考以下文章

如何添加atl工程实现接口实现ipersistfile

ATL/COM : 在 IDL 文件中我们可以创建一个可以用作返回类型的类

如何在基于 ATL 的服务器中正确转换和使用本机 COM 类型?

错误 C2664:无法将参数 2 从 'const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *' 转换为 'ATL::CAdapt&l

如何防止在 ATL 类型库中公开 coclass 实现

ATL ActiveX DLL 作为映射类型图像和数据加载两次