COM接口智能指针作为函数参数触发C26415/C26418警告如何解决?
你之前修改时语法报错的核心原因是把参数写为了占位符T*,没有替换为实际的COM接口类型,按以下步骤修改即可消除警告:
步骤1:修改函数声明与定义
将参数中的智能指针类型替换为原生COM接口指针:
// 声明(头文件中) void SetPublisherDatesNotAvailable(MSAToolsLibrary::IAvailability* pAvailability, std::vector<COleDateTime>& rVectorDates, DWORD dwNumDates); // 定义(源文件中) void CMSATools::SetPublisherDatesNotAvailable(MSAToolsLibrary::IAvailability* pAvailability, std::vector<COleDateTime>& rVectorDates, DWORD dwNumDates) { // 原有内部代码不需要修改,直接用pAvailability->调用方法即可 throw_if_fail(pAvailability->SetDatesNotAvailable(arr.parray)); }
步骤2:修改函数调用代码
调用时通过智能指针的GetInterfacePtr()方法获取原生接口指针传入:
MSAToolsLibrary::IAvailabilityPtr pAvailability = NULL; throw_if_fail(pPublisher->get_Availability(&pAvailability)); if (pAvailability != NULL) { std::vector<COleDateTime> vectorDates; const DWORD dwNumDates = InitDatesNotAvailableVector(vectorDates); // 传入原生接口指针 theApp.MSAToolsInterface().SetPublisherDatesNotAvailable(pAvailability.GetInterfacePtr(), vectorDates, dwNumDates); }
补充说明
- 这种修改完全符合警告的修复规则:函数不需要管理COM对象的生命周期,仅访问对象成员时使用原生指针即可,不会改变原有代码的运行逻辑。
- 如果你希望强制要求参数非空,也可以将参数改为接口引用
MSAToolsLibrary::IAvailability&,调用时传入*pAvailability,函数内部使用.访问成员即可。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

