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)