获取 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 检索数组