我用VC2003写了一个ActiveX,然后在Delphi中调用,其中有一个事件,在VC中是这样定义的
void RegisterDone(VARIANT reg)
{
FireEvent(eventidRegisterDone, EVENT_PARAM(VTS_VARIANT), reg);
}
========
调用部份代码:
VARIANT vTmp;
::VariantInit(&vTmp);
vTmp.vt = VT_I4;
vTmp.lVal = 100;
RegisterDone(vTmp);
================
在Delphi中使用则是:
procedure TfrmMain.fvcsRegisterDone(Sender: TObject; reg: OleVariant);
begin
  // 在这里哪怕我是一行代码不写也会出错,错误信息:
  // Access violation at address 7C2E7C97 in module 'MFC71D.DLL'. Read of address CCCC0003
end;==============
这是怎么回事,请大家帮忙解决,谢谢!  

解决方案 »

  1.   

    写个小程序(vc)调用这个ActiveX控件,单步调试一下。
      

  2.   

    我作了个测试,就算在VC中调用也会出错。
    假如在ActiveX中定义一个方法如下,只有一个参数vaIn
    LONG CFVControlCtrl::Hello1(VARIANT vaIn)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码 return vaIn.lVal;
    }
    然后,在另一个VC小程序中作如下调用
    CComVariant v(99);
    m_Result = m_fvcs.Hello1(v);
    this->UpdateData(FALSE);
    马上就出错了,跟踪后进入oledisp1.cpp(VC自带的文件中),在
    // do standard method call
    sc = pThis->CallMemberFunc(pEntry, wFlags,pvarResult, pDispParams, &uArgErr);
    这一句时出错。
    请高手指点。
      

  3.   

    试试void RegisterDone(VARIANT& reg)
      

  4.   

    还好,如果,我把参数改为指针LONG CFVControlCtrl::Hello1(VARIANT* vaIn);
    然后调用时也用指针,就没有问题。
      

  5.   

    to dfyang:
    RegisterDone是干什么用的,在哪个头文件里?MSDN中找不到?