试图通过一个指向COM接口的智能指针来调用一个函数
Trying to call a function via a pointer to a smart pointer to a COM interface
我在这里遵循Microsoft教程(在SO的一点帮助下)从c++代码中调用COM对象。
教程第9步说:
要调用托管DLL,请将以下代码添加到_tmain功能:
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));
当我在我的文件中使用这些代码行时,它们工作得很好,并且我成功地调用了COM接口上的函数。
现在,我需要在2个静态函数中访问pICalc,所以我想使它成为一个静态类变量(我知道static在这句话中有2个不同的含义)。
这是我的代码:
在MyCPlusPlusClass.h:static ICalculatorPtr* pICalc;
在MyCPlusPlusClass.cpp: //Pointer definition
ICalculatorPtr* MyCPlusPlusClass::pICalc;
和在静态函数中:
pICalc = new ICalculatorPtr(__uuidof(ManagedClass));
但是当我尝试用
调用函数时(*pICalc)->SomeICalcFunction();
我得到_com_issue_error(Int32) at _com_ptr_t…
我主要是c#程序员,所以我只是在c++中犯了一个愚蠢的语法错误?
编辑:在.tlh文件中,有
struct __declspec(uuid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")) _ManagedClass
_COM_SMARTPTR_TYPEDEF(ICalc, __uuidof(ICalc));
_COM_SMARTPTR_TYPEDEF(_ManagedClass, __uuidof(_ManagedClass));
virtual HRESULT __stdcall SomeICalcFunction (BSTR * pRetVal) = 0;
好的,我认为,你必须这样做。
在MyCPlusPlusClass.h: 改变static ICalcPtr* pICalc;
static ICalcPtr pICalc;
在MyCPlusPlusClass.cpp: 改变//Pointer definition
ICalcPtr* MyCPlusPlusClass::pICalc;
ICalcPtr MyCPlusPlusClass::pICalc;
在所有的静态函数中:
if(pICalc == NULL)
{
if(FAILED(pICalc.CreateInstance(__uuidof(ManagedClass))))
std::cout << "Can't create pICalc" << std::endl;
}
然后使用:
pICalc->SomeICalcFunction();
我真的不明白为什么需要静态函数。让它们都是非静态的,pICalc也是非静态的。这样会更干净。
相关文章:
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 是否可以创建一个指向对象的智能指针并将此智能指针作为参数传递给构造函数?
- 通过智能指针调用另一个类的成员函数
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 带有显式构造函数的智能指针使我有一个错误
- 我创建了自己的智能指针类,我用这个智能指针指向一个类实例,如何正确返回智能指针
- 为什么将对象从一个智能指针移至另一个原因崩溃
- 视觉效果如何使用New New初始化一个智能点
- 智能指针类的一个简单实现
- 如何编写一个可以接受函数指针和/或函子的类,就像智能指针对自定义deleter所做的那样
- 如果我定义一个指向智能指针的指针,这是否消除了智能指针的优点
- 矢量可以包含一个智能指针,该指针重载运算符&?
- 如何强制一个类只使用智能指针实例
- 在头文件中定义一个COM智能指针作为成员
- 如何用C包装一个返回智能指针的C++函数
- 试图通过一个指向COM接口的智能指针来调用一个函数
- 一个带有智能数组对象的类
- 可以谷歌模拟一个方法与智能指针返回类型