获取 CComPtr 参数

Posted

技术标签:

【中文标题】获取 CComPtr 参数【英文标题】:Getting CComPtr parameters 【发布时间】:2021-08-31 15:01:03 【问题描述】:

我有一个需要从中调用函数的 COM DLL“XPLib.dll”。 我正在尝试使用 ATL::CComPtr,但我不知道从哪里获取所需的信息。 我没有任何标题或文档,只有一个 dll。

到目前为止,我正在这样做

ATL::CComPtr<IXPLibVacSystemControl> pVac;
hr = pVac.CoCreateInstance("CLSID_IXPLibVacSystemControl")

正如我在网上看到的其他人所做的那样,但我遇到了错误

'IXPLibVacSystemControl' : undeclared identifier
'pVac' : unknown size
'ATL::CComPtr' : No appropriate default constructor available

我是 COM / ATL 的新手,所以我不确定从哪里获取这些数据。

我正在使用面向 Windows XP 的 Visual Studio 2008。

【问题讨论】:

尝试使用 TypeLibrary 检查工具检查“XPLib.dll”。如果 DLL 确实包含类型库,请尝试 #import "XPLib.dll" docs.microsoft.com/en-us/cpp/preprocessor/… 还要检查您是否有单独的 XPLib.tlb 文件,您可以为定义#import 这个。 如果代码中没有IXPLibVacSystemControl 接口的声明,就不能使用COM 对象。如果你没有它的头文件,你需要获取它。此外,"CLSID_IXPLibVacSystemControl" 可能不是此 COM 对象的有效 ProgID,它应该是 CLSID_IXPLibVacSystemControl(没有引号,即pVac.CoCreateInstance(CLSID_IXPLibVacSystemControl)),但是您还需要CLSID_IXPLibVacSystemControl 的定义,它应该在相同的头文件。 【参考方案1】:

您的项目可能有一个名为 stdafx.h 的文件和一个名为 stdafx.cpp 的文件。

至少,您需要向 stdafx.h 添加一条导入语句:

#import "XPLib.dll"

那么您应该能够使用以下内容创建对象:

hr = pVac.CoCreateInstance  ( __uuidof(XLPlib::IXPLibVacSystemControl) ) ;

要使用示例中的语法,您需要创建 import 语句

#import "XPLib.dll" no_namespace named_guids

它生成变量 CLSID_IXPLibVacSystemControl,并且不打扰命名空间 XPLib。那么你应该可以使用

hr = pVac.CoCreateInstance ( CLSID_IXPLibVacSystemControl ) ;

但您不需要在名称周围使用引号。

(您需要使用逗号来创建对象,使用其所谓的 ProgID,它可能是“XLPlib.IXPLibVacSystemControl”)。

最后,通常更好的做法是将 import 语句分成两部分。

在 stdafx.h 中

#import "XPLib.dll" no_namespace named_guids no_implementation

在 stdafx.cpp 中

#import "XPLib.dll" no_namespace named_guids implementation_only


    

【讨论】:

以上是关于获取 CComPtr 参数的主要内容,如果未能解决你的问题,请参考以下文章

COM 中 CComPtr 优于 CComQIPtr 的用途是啥?

通过 CComPtr<IDispatch> Invoke 检索数组

访问 ccomptr 指针和应用程序崩溃时访问冲突(c 系统异常代码:c0000005)

COM 对象清理

如何在应用程序退出时诊断 comptr 版本中的异常

CBasePin递增对拥有过滤器的引用。循环参考?