zoukankan      html  css  js  c++  java
  • Winform 调用C++ OCX 传入参数和传出参数问题

    Winform或者wpf调用OCX的时候,经常涉及到参数传入,和返回的问题

    因为.net是托管类型的,所以像vb这样非托管,直接传入内存首地址,在.net是行不通的

    下面举例

    1.c++需要传出的话,声明参数应该是:short MyCtrl::MyFunction(VARIANT FAR* data) 用于传出,在C#里面生成的类型是 ref object data,既然有了ref这个属性,那么回传数据,就没问题了

    2.然后在c++ 里面对于这个参数的处理,这里我们使用到了SAFEARRAY进行处理

    short CWvideoCtrl::MyFunction(VARIANT FAR* data)
    {
     SAFEARRAY* psa=data->parray; //psa是一个SAFEARRAY数组
     short *pData = NULL;
     SafeArrayAccessData( psa, (void**)&pData );//通过SAFEaRRAY就可以对c++里面的变量赋值,接下来的操作,就和C++一样
     short sRet = TestFunction(pData);
     SafeArrayUnaccessData(psa);
     return sRet;
    }

    3.在.net里面生成的ref object data这参数怎么传递,要用到 System.Runtime.InteropServices.VariantWrapper这个传递

        short[] data = new short[100];

        object vars = new System.Runtime.InteropServices.VariantWrapper(data);

      MyOcx.MyFunction(ref vars);

    基于上面三点,我们就可以完成C#中调用C++ OCX,并返回参数的问题了

    最后补充一下,如果只是传入的话,OCX的声明可以写为 short MyCtrl::MyFunction(VARIANT FAR& data)

  • 相关阅读:
    JFreeChart API 说明(转)
    杭电1064
    杭电2734
    杭电1170
    杭电1197
    杭电2629
    杭电1062
    杭电2088
    杭电1205
    杭电1004
  • 原文地址:https://www.cnblogs.com/wisexie/p/5312004.html
Copyright © 2011-2022 走看看