在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/

10-09 05:06