我从厂家获得一个OCX组件,其中有个函数A,调用它是会触发事件OnA(long s, short* v, long length)。
我在.net中调用此组件,名字为wap
这个OnA事件在.net中被包装成,wap_OnA(object sender, AxWPALMLib._DWPalmEvents_OnCaptureEvent e),
其中e内包含属性int型s,short型v,int型length
问题:
1、属性 v 在ocx组件是数据的指针,在.net中却变成了short型的。
2、函数A调用后会多次触发OnA事件并返回 s  的值,请问事件OnA怎么能获取连续的 s 值。在C++bulider中能执行通过,但是在.net中却不能获取值。

解决方案 »

  1.   

    使用out关键字,然后传递e的值,然后再通过其他全局变量获取e.s的值。
    代码如下:
    //定义变量
    private AxWPALMLib._DWPalmEvents_OnCaptureEvent ev = new AxWPALMLib._DWPalmEvents_OnCaptureEvent();
    object a = new object();声明事件处理函数的时候这样:
    wap_OnA(object sender, out AxWPALMLib._DWPalmEvents_OnCaptureEvent e)
    调用时这样:
    wap_OnA(a, out ev)执行完后用ev.s获取s的值。这样就可以了。
    希望能帮到你。
      

  2.   

    “在C++bulider中能执行通过”,你把C++bulider中如何使用的贴出来看看
      

  3.   

    (1)private AxWPALMLib._DWPalmEvents_OnCaptureEvent ev = new AxWPALMLib._DWPalmEvents_OnCaptureEvent();
    这样行不通,因为OnCaptureEvent事件有三个参数
    (2)wap_OnA(object sender, out AxWPALMLib._DWPalmEvents_OnCaptureEvent e)
    参数e签名不能用out,提示“控制离开当前方法之前必须对out参数e赋值”
    (3)wap_OnA(object sender, out AxWPALMLib._DWPalmEvents_OnCaptureEvent e)
    事件内部怎么写。
    wap_OnA(a, out ev)是循环调用吗?
    我这方面经验不足,最好能写个完整的代码段,先谢谢你了。
      

  4.   


    OnA是事件,这跟C#的事件是一样的,用使用方去订阅!
    使用关心的是对事件参数的处理,而不是调用这个事件处理方法!
    所以,2楼基本没有涉及到问题核心!“属性 v 在ocx组件是数据的指针,在.net中却变成了short型的。”
    lz,你把AxWPALMLib._DWPalmEvents_OnCaptureEvent在C++和C#定义结构体都贴出来,
    好有针对性解决问题!还有,数据的指针,是指一个数组缓冲区吗?