这样用PSafeArray
在一位数组中正常。换成二位数组就会抛 "灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))"
Values是C#.NET传过来的object[,]二位数组。
procedure TActiveSafeArrayTest2.AddRange(Values: PSafeArray);
var
v : Variant;
i, j, lbound, lbound2, ubound, ubound2 : Integer;
ov : OleVariant;
type
vta = array of array of OleVariant;
begin
dims := SafeArrayGetDim(Values); if(dims > 2) then
begin
ShowMessage('错误,数组维数必须小于2');
exit;
end; if(dims = 2) then begin
try
SafeArrayAccessData(Values, p); SafeArrayGetUBound(Values, 1, ubound);
SafeArrayGetLBound(Values, 1, lbound);
SafeArrayGetUBound(Values, 2, ubound2);
SafeArrayGetLBound(Values, 2, lbound2); for i := lbound to ubound do
for j := lbound2 to ubound2 do
begin
//这里抛异常
ov := vta(p)[i-lbound, j-lbound2];
if FEvents <> nil then FEvents.OnLog(ov);
end;
finally
SafeArrayUnAccessData(Values);
end;
end else begin
//访问一位数组正常 SafeArrayGetUBound(Values, 1, ubound);
SafeArrayGetLBound(Values, 1, lbound);
//ShowMessage('数组大小:' + IntToStr(lbound) + '/' + IntToStr(ubound)); try
SafeArrayAccessData(Values, p);
for i := lbound to ubound do
begin
ov := vt(p)[i];
if FEvents <> nil then FEvents.OnLog(ov);
end;
finally
SafeArrayUnAccessData(Values);
end; end;
end;
在一位数组中正常。换成二位数组就会抛 "灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))"
Values是C#.NET传过来的object[,]二位数组。
procedure TActiveSafeArrayTest2.AddRange(Values: PSafeArray);
var
v : Variant;
i, j, lbound, lbound2, ubound, ubound2 : Integer;
ov : OleVariant;
type
vta = array of array of OleVariant;
begin
dims := SafeArrayGetDim(Values); if(dims > 2) then
begin
ShowMessage('错误,数组维数必须小于2');
exit;
end; if(dims = 2) then begin
try
SafeArrayAccessData(Values, p); SafeArrayGetUBound(Values, 1, ubound);
SafeArrayGetLBound(Values, 1, lbound);
SafeArrayGetUBound(Values, 2, ubound2);
SafeArrayGetLBound(Values, 2, lbound2); for i := lbound to ubound do
for j := lbound2 to ubound2 do
begin
//这里抛异常
ov := vta(p)[i-lbound, j-lbound2];
if FEvents <> nil then FEvents.OnLog(ov);
end;
finally
SafeArrayUnAccessData(Values);
end;
end else begin
//访问一位数组正常 SafeArrayGetUBound(Values, 1, ubound);
SafeArrayGetLBound(Values, 1, lbound);
//ShowMessage('数组大小:' + IntToStr(lbound) + '/' + IntToStr(ubound)); try
SafeArrayAccessData(Values, p);
for i := lbound to ubound do
begin
ov := vt(p)[i];
if FEvents <> nil then FEvents.OnLog(ov);
end;
finally
SafeArrayUnAccessData(Values);
end; end;
end;
vt的类型是 vt = array of OleVariant;
还有几个字打错了,"二位"应该改为"二维" - -!
我试过,用SafeArrayGetElement的方法,得到的值全是空,包括一维、二维 全获取不到。
所以才采用SafeArrayAccessData和指针的方法.以下是使用 SafeArrayGetElement的代码,专家们看看有什么问题:
var
Inc : array of Integer;
v : OleVariant; //这里不管是OleVariant还是Variant 都不行
begin
...
SetLength(Inc, 2);
Inc[0] := i;
Inc[1] := j; //这里,虽然程序不会抛出"灾难性故障"的异常,可是值都获取不了,得出来的都是空
SafeArrayGetElement(Values, Inc, v); ...