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)

原文地址:https://www.cnblogs.com/wisexie/p/5312004.html