需要用 C++ 访问一个ActiveX控件,接口中一个函数的有Variant参数:DoGo
Named Params = u'nNumberOfAxes, nAxisArray'
Return Type = 'Void'
Argument = 'Integer 2'
Argument = 'Variant'
Function kind = 'Dispatch'
Invoke Kind = 'Function'
Number Optional Params = 0在VC++ 6.0 中,生成的包装函数的声明是:
    void DoGo(short nNumberOfAxes, const VARIANT& nAxisArray);调用的例子:
const int nSize(3);
short nAxesArray[nSize] = { 0, 1, 2};
COleSafeArray arrAxes;
arrAxes.CreateOneDim(VT_I2,nSize,nAxesArray);
MintController1.DoGo (3, arrAxes);由于某些原因,不能使用MFC,需要用C++直接调用Invoke,但不清楚VARIANT怎么才能把短整型数组包起来,像下面的尝试,都有问题short axes[3]={0,1,2};VARIANTARG v[2];
v[1].iVal = 3;
v[1].vt = VT_I2;
v[0].piVal = axes
v[0].vt = VT_BYREF|VT_I2;DISPPARAMS params = {v, NULL, 2, 0};iface->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,&params ,NULL, NULL, NULL);这个具体该怎么做呢?谢谢

解决方案 »

  1.   

    使用SafeArraySafeArrayCreate 创建SafeArray
      

  2.   

    v[0].vt = VT_BYREF|VT_I2;  ==> v[0].vt = VT_ARRAY|VT_I2;
    VARIANTARG v[2];
    v[1].iVal = 3;
    v[1].vt = VT_I2;
    v[0].piVal = axes
    v[0].vt = VT_BYREF|VT_I2;

    ::VariantCopy(&v[0], (LPCVARIANT)axes);DISPPARAMS params = {v, NULL, 2, 0};iface->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,&params ,NULL, NULL, NULL);::VariantClear(&v[0]);
      

  3.   


    谢谢大家回复,可是LPCVARIANT似乎还是MFC的吧,不用它该怎么做呢?如果不是MFC中的的话需包含那个头文件呢?
    另外能不能给个 SafeArrayCreate 的例子 (问题比较弱,见笑) 
    谢谢
      

  4.   

    你的COleSafeArray也是MFC的,如果不用MFC,可以用ATL中的CComSafeArray,不过版本要求高点,VC6没有这个类。还有这个类只对SAFEARRAY做了浅度封装,没有COleSafeArray好用,操作稍微复杂一点。
      

  5.   

    谢谢大家,下面的代码可以工作了, 但不清楚写法上有没有问题,或者是否可以简化
            short axes0[5]={0,1,2,3,4};
            SAFEARRAY *axes;
            SAFEARRAYBOUND axesbound[1];
            axesbound[0].lLbound = 0;
            axesbound[0].cElements = 5;
            axes = ::SafeArrayCreate(VT_I2, 1, axesbound);
            for(long index=0;index<5;index++)
            {
                ::SafeArrayPutElement(axes,&index,axes0+index);
            }        VARIANTARG v[2];
            v[1].iVal = 5; 
            v[1].vt = VT_I2;
            v[0].parray = axes;
            v[0].vt = VT_ARRAY|VT_I2;是这样子的,不用MFC是因为我用的Qt。以前也没接触过COM编程。用ActiveQt提供的包装类时操作一个ActiveX控件时,搞不清楚这个参数VARIANT如何处理。最后看了几天 COM技术内幕,决定用C++直接访问。但控件只提供了VC6的例子,所以才有此问题。ActiveQt原始问题,在 http://www.qtcentre.org/forum/f-qt-programming-2/t-activeqt-qvariant-and-vc-variant-24201-post117128.html#post117128如果有人知道如何解决这个问题就更好了谢谢大家