• 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)

  • 相关阅读:
    div水平居中和垂直居中
    HTML流动布局各种宽度自适应
    PHP导出大量数据到excel表格
    等比例压缩图片到指定的KB大小
    SQLServer数据库中创建临时表
    Mysql数据库表关于几个int类型的字符长度
    JS 获取浏览器和屏幕宽高信息
    CTSC2018 & APIO2018 颓废 + 打铁记
    [UOJ#192]【UR #14】最强跳蚤
    ZJOI2018 Day2 滚粗记 + 流水账
  • 原文地址:https://www.cnblogs.com/wisexie/p/5312004.html
Copyright © 2020-2023  润新知