在c++中,MFC:
我有一个CComPointer:
CComPointer<IMyTask> m_pTask;
我的代码中有很多地方,我调用此ComPointer来运行任务的方法。例如:
void method1()
{
if (FAILED(hRet = m_pTask->MyFunc1()))
.....
}
void method2()
{
if (FAILED(hRet = m_pTask->MyFunc2()))
.....
}
我尝试解决MyTask关闭时要恢复的问题。
我写了一个方法restore(),将CoCreate重新运行到MyTask,它实际上解决了这个问题。
我可以看到,如果MyTask已死,我得到的HR失败代码为-2147023174,则RPC服务器不可用。但是,com指针m_pTask具有完整的数据(它不知道任务已死)。
我可以做这样的事情:
void method1()
{
if (FAILED(hRet = m_pTask->MyFunc1()))
if (hRet == -2147023174)
recover();
.....
}
void method2()
{
if (FAILED(hRet = m_pTask->MyFunc2()))
if (hRet == -2147023174)
recover();
.....
}
但是,因为我有很多通过compointer调用方法的方法,所以我想做一些更通用的事情。
我希望每次我尝试通过ComPointer在运行该方法之前运行一个方法时,都要检查该任务是否已经存在,如果不存在,请运行恢复方法。
由于即使任务完成了,ComPointer仍然拥有CoCreate时代的所有数据,所以我不知道该怎么办。
我该怎么做?
由于系统中发生了一些错误,因此该任务已失效,现在,我的解决方案不需要找到任务失败的原因,只需恢复即可。我正在寻找一个通用的解决方案-像ComPointer的包装器一样,但是我希望包装器类仅检查MyTask是否仍然存在,如果是-它将返回ComPointer,如果不存在,它将运行restore 。
我该怎么做?
最佳答案
好的,这是对一般问题的一般回答。我不想知道,为什么指针实际上没有完成,为什么任务实际上已经死了。为任务指针编写一个包装器,然后使用它。它看起来像这样:
class CMyTaskWrapper
{
CComPtr<IMyTask> m_ptr;
...
HRESULT myFunc1()
{
HRESULT hRes = m_ptr->myFunc1();
if(hRes == 0x800706BA)
{
recover();
}
return hRes;
}
... //here you should list all members of IMyTask
};
编辑1:添加了一个宏示例(请参阅注释2)
MYMACRO_0(HRESULT_GETTER, POINTER, FUNCTION) \
HRESULT_GETTER = POINTER->FUNCTION(); \
if(HRESULT_GETTER == 0x800706BA) recover(); \
HRESULT_GETTER = POINTER->FUNCTION()
MYMACRO_1(HRESULT_GETTER, POINTER, FUNCTION, PARAM1) \
HRESULT_GETTER = POINTER->FUNCTION(PARAM1); \
if(HRESULT_GETTER == 0x800706BA) recover(); \
HRESULT_GETTER = POINTER->FUNCTION(PARAM1)
//here you should add MYMACRO_2 ... MYMACRO_N
您可以通过以下方式使用它:
MYMACRO_0(hRes, m_pTask, MyFunc1);
MYMACRO_1(hRes, m_pTask, MyFunc2, parameter_to_pass);
这可能会有所帮助,这将隐藏函数列表,但是使用这样的代码并不是一个好主意。
关于c++ - 检查COM指针是否存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10913846/