用智能指针实现com连接点,import后的tlh相关部分
struct __declspec(uuid("697c743a-86e2-42e9-b6ab-4f4916285795"))
_ServerEvents : IDispatch
{
    // Methods:
    HRESULT OnCompleteEvent (struct CompleteEvent * NewCompleteEvent );
 };
...
struct __declspec(uuid("76c38bf1-4af8-4e47-a2ee-c269d58d3bfa"))
CompleteEvent : IDispatch
{
    ...
}send方法触发OnCompleteEvent事件
我是这么定义
BEGIN_DISPATCH_MAP( CAbc, CDialog)
DISP_FUNCTION_ID(CAbc,"OnCompleteEvent",1,OnCompleteEvent,VT_EMPTY,VTS_VARIANT)
END_DISPATCH_MAP( )
...
void CHhhkkDlg::OnExecutionOver2(struct CompleteEvent *NewCompleteEvent )
{
 printf("success");
//下面这行获取CompleteEvent相应的对象,运行时错误
 Object o=NewCompleteEvent -> GetObject();
}我的问题是
我的程序能正确的响应事件,打印出"success",但是每次当GetObject的时候,就说Ole错误,可是用_com_error和COleException都捕捉不到,我怀疑是不是参数再DispatchMap中声明错了,那应该声明为什么呢?还是另外有别的原因?

解决方案 »

  1.   

    着急写错了,
    void CHhhkkDlg::OnExecutionOver2(struct CompleteEvent *NewCompleteEvent )
    应该是
    void CAbc::OnCompleteEvent(struct CompleteEvent *NewCompleteEvent )
      

  2.   

    是有效的指针,不是NULL,但是我每次使用指针读取数据就会报Access Violation
      

  3.   

    这连接点是进程内的还是进程外的?
    把idl文件和Getobject函数贴出来看一下
      

  4.   

    我把错误工程上传了,老大帮忙看看
    http://202.107.104.22/chl/tommy/Problem.zip
      

  5.   

    你的RightFax实例是在哪调用的?好像你在析构函函数就CoUninitialize()了.(CompleteEventPtr NewCompleteEvent)是空指针吧.
      

  6.   

    看样子是指针的问题,你下次把断点防到long ddd=NewCompleteEvent->GetFaxHandle();
    然后F11单步跟踪,看他在哪步出的错
      

  7.   

    杯子说的问题正是我正在想的!!!
    析构函函数作了以下几个事情
    1.AfxConnectionUnadvise
    2.CoUnitialize
    我在析构函数里设置了段点,发现每次都是先调析构然后再进入OnComplete响应函数
    main.cpp
    int main(){
     RightFax o;
     o.SendFax();//稍候会激发OnComplete事件
     scanf("%d",&d");//阻塞进程
    }
    可是确认并且避免问题发生呢
      

  8.   

    awnucel(西大耻犹未雪,南京恨何时灭&抵制日货) 
    我把指针设置到上面了,就是这步出的错,我按F10就会产生异常,F11倒没试验过,我没有com的源码,F11会出现什么效果?明天上班试验试验