托管c++ 【AccessViolationException】

托管 C++在调用非托管C++时产生如下异常:

System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

这个异常调试过程中还无法用try{}catch{}捕获。

SunfytechAPIClrDll::SunfytechAPIClr::SunfytechAPIClr()

{ 

    mySunfyMCA132API = new SunfytechMCA132API(); //initiate C++ class's instance

//    pkSFXDataReport = gcnew SFXDataReport_clr();

    // cast our managed method to a delegate

    callback_SFXData = gcnew SFXDataReportProcess_wrap(&SunfytechAPIClrDll::SunfytechAPIClr::del_SFXDataReport);

    // get a pointer to the delegate

    IntPtr cbPtr1 = Marshal::GetFunctionPointerForDelegate(callback_SFXData);

    // call the native C++ function with our delegate pointer

    mySunfyMCA132API->SetProcFunc_SFXDataReport( static_cast<SFXDataReportProcess>(cbPtr1.ToPointer()));

}

实际原因是上述代码中callback_SFXData如果不作为SunfytechAPIClrDll的static成员,那么由于在托管代码下仅仅将它作为函数指针复制给非托管代码,如果callback_SFXData非static成员,在某个时候会被GC回收,导致非托管代码无法使用这个内存而出错。所以callback_SFXData必须是static,如下所示:

    public ref class SunfytechAPIClr

    {

public:

     

    delegate void SFXDataReportProcess_wrap(SFXDataReport &sfdatareport);

    static SFXDataReportProcess_wrap^  callback_SFXData;  // 这里需为static,否则会出现"AccessSystem.AccessViolationException" 错误。这是由于callback_SFXData被gcnew之后,由于当前程序控件没有地方再引用它,会导致被系统收回,而在非托管代码中由用了这个它。

    delegate void Rx_SFXDataReport(SFXDataReport_clr^ pkclr);

    

    static event Rx_SFXDataReport^ On_SFXDataReportProcess;

 ......

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值