我用delphi写了一个ActiveX,这里需要和脚本 传递字节数组。
我看看了一个例子
然后根据vc改了下procedure TYoYoMemory.TestFun1(out buf: OleVariant);
var
  psa:PSafeArray;
  sad:SAFEARRAYBOUND;
  idx:Cardinal;
  com_v:OleVariant;
  a:POleVariant;
begin
  sad.lLbound:=0;
  sad.cElements:=3;
  psa:=SafeArrayCreate(VT_VARIANT,1,sad);
  idx:=0;
  SafeArrayPutElement(psa,idx,idx);
  inc(idx);
  SafeArrayPutElement(psa,idx,idx);
  inc(idx);
  SafeArrayPutElement(psa,idx,idx);
  buf.vt:=VT_ARRAY or VT_VARIANT;
  buf.parray:=psa;
  这里错误 [DCC Error] E2160 Type not allowed in OLE Automation call
end;
就算去掉这一句运行的时候buf.vt:=VT_ARRAY or VT_VARIANT;也会报错。求高手指点,我也搜索很多网页,不到这一步不会来麻烦大家的。
谢谢

解决方案 »

  1.   

    调用了不允许的类型,
    typedef struct tagSAFEARRAYBOUND { unsigned long cElements; 
    long lLbound; } SAFEARRAYBOUND; SAFEARRAYBOUND是个结构体,你这样直接buf.parray:=psa赋值应该会有问题
      

  2.   

    不好意思,刚才看错了 我以为你是这样赋值的呢buf.parray:=sad;PSafeArray是什么类型啊?
      

  3.   

    google了一下,请看:
    PsafeArray是一個Record的pointer, 宣告在Activex.pas中,如下    PSafeArray = ^TSafeArray;
        {$EXTERNALSYM tagSAFEARRAY}
        tagSAFEARRAY = record
        cDims: Word;
        fFeatures: Word;
        cbElements: Longint;
        cLocks: Longint;
        pvData: Pointer;
        rgsabound: array[0..0] of TSafeArrayBound;
        end;
        TSafeArray = tagSAFEARRAY;具体参考此贴:http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=40461
      

  4.   

    我知道这个。
    上面的代码根据一个C++改成delphi的。
    然后就出错了。
    相当郁闷。所以来问问大家。
    谢谢楼上。
    我去看看
      

  5.   

    楼上这个帖子我已经看过。试着这样改写了。TVarDate(buf).VArray:=PVarArray(psa);编译通过,但是在 运行的时候
    buf.vt:=VT_ARRAY or VT_VARIANT;
    这句报错。
    EurekaLog 记录下来错误是:
    type:EVariantInvalidOpError
    message:Invalid variant operation.
      

  6.   

    此贴继续讨论。
    我打算把字节数组 格式化成字符串,传出去。哎。
    米有其他办法。
    字节数组有512,分隔符1,每个字节用2个char表示,这个字符串1536的长度,应该还好。
    然后js 或者vbs用split 分成字符数组,然后遍历转成字节数组。不过还是想学习直接传数组的。
    方法是 safeArray 封装到variant中。
    不过不知道怎么用delphi来实现?
    翻译C++的 又翻译错了。还是自己不行呀。