我用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;也会报错。求高手指点,我也搜索很多网页,不到这一步不会来麻烦大家的。
谢谢
我看看了一个例子
然后根据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;也会报错。求高手指点,我也搜索很多网页,不到这一步不会来麻烦大家的。
谢谢
typedef struct tagSAFEARRAYBOUND { unsigned long cElements;
long lLbound; } SAFEARRAYBOUND; SAFEARRAYBOUND是个结构体,你这样直接buf.parray:=psa赋值应该会有问题
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
上面的代码根据一个C++改成delphi的。
然后就出错了。
相当郁闷。所以来问问大家。
谢谢楼上。
我去看看
buf.vt:=VT_ARRAY or VT_VARIANT;
这句报错。
EurekaLog 记录下来错误是:
type:EVariantInvalidOpError
message:Invalid variant operation.
我打算把字节数组 格式化成字符串,传出去。哎。
米有其他办法。
字节数组有512,分隔符1,每个字节用2个char表示,这个字符串1536的长度,应该还好。
然后js 或者vbs用split 分成字符数组,然后遍历转成字节数组。不过还是想学习直接传数组的。
方法是 safeArray 封装到variant中。
不过不知道怎么用delphi来实现?
翻译C++的 又翻译错了。还是自己不行呀。