这样用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;

解决方案 »

  1.   

    漏了,
    vt的类型是   vt = array of OleVariant;
    还有几个字打错了,"二位"应该改为"二维" - -!
      

  2.   

    没有人知道怎么用指针的方式访问SafeArray吗?
    我试过,用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);  ...