Delphi TCustomADODataSet.FilterOnBookmarks

Delphi TCustomADODataSet.FilterOnBookmarks,delphi,ado,Delphi,Ado,我有一个旧的应用程序,它总是运行良好。最近,它开始在方法FilterOnBookmarks中抛出EAccessViolation异常。我不知道它是什么时候开始的,也许是我在XE10.1下重建它的时候 procedure TCustomADODataSet.FilterOnBookmarks(Bookmarks: array of const); var I: Integer; BookmarkData: OleVariant; begin CheckBrowseMode; Boo

我有一个旧的应用程序,它总是运行良好。最近,它开始在方法FilterOnBookmarks中抛出EAccessViolation异常。我不知道它是什么时候开始的,也许是我在XE10.1下重建它的时候

procedure TCustomADODataSet.FilterOnBookmarks(Bookmarks: array of const);
var
  I: Integer;
  BookmarkData: OleVariant;
begin
  CheckBrowseMode;
  BookmarkData := VarArrayCreate([Low(Bookmarks), High(Bookmarks)], varVariant);
  for I := Low(Bookmarks) to High(Bookmarks) do
     BookmarkData[I] := POleVariant(TVarRec(Bookmarks[I]).VPointer)^;
  inherited SetFilterText('');
  FFilterGroup := fgUnassigned;
  DestroyLookupCursor;
  try
    Recordset.Filter := BookmarkData; //<---- Here I get EAccessViolation

    First;
    inherited SetFiltered(True);
  except
    inherited SetFiltered(False);
    raise;
  end;
end;
过程TCustomADODataSet.FilterOnBookmarks(书签:常量数组);
变量
I:整数;
书签数据:OleVariant;
开始
CheckBrowseMode;
BookmarkData:=VarArrayCreate([Low(书签),High(书签)],varVariant);
对于I:=低(书签)到高(书签)do
BookmarkData[I]:=POleVariant(TVarRec(Bookmarks[I]).VPointer)^;
继承的SetFilterText(“”);
FFilterGroup:=fgUnassigned;
破坏lookupcursor;
尝试

Recordset.Filter:=书签数据// 问题不在德尔福。 我们也有同样的问题。 见: 问题出在,, C:\Program Files(x86)\Common Files\System\ado\msado15.dll 经过最近的升级。
如果用升级前的msado15.dll替换msado15.dll,则应用程序运行良好。

我们暂时解决了该问题。 我们在中替换了msado15.dll C:\ProgramFiles(x86)\Common Files\System\ado
我们从未升级的计算机上获取了msado15.dll。

找到解决方案了吗?(没有应用程序更改)我们有同样的问题,我们无法更改应用程序。谢谢谢谢@user3648935!将旧版本的msado15.dll放入应用程序工作目录是否可以解决问题?我在哪里可以找到它?非常感谢,@user3648935!
type TSQLVarRecArray = array of TVarRec;


PBookmark = ^TBookmark;

TSQLBookmarkList = class(TList)
  private
 ...   
  protected
    function Get(Index: Integer): PBookmark;
  public
...
    procedure Add(Bookmark: TBookmark);
    property Items[Index: Integer]: PBookmark read Get; default;
    function ToVarRecArray: TSQLVarRecArray;
  end;

procedure TSQLBookmarkList.Add(Bookmark: TBookmark);
var PB: PBookmark;
    L: Integer;
begin
  New(PB);
  L := Length(Bookmark);
  SetLength(PB^, L);
  PB^ := Copy(Bookmark, 0, L);
  inherited Add(PB);
end;


function TSQLBookmarkList.ToVarRecArray: TSQLVarRecArray;
var I: Integer;
begin
  SetLength(Result, Count);
  for I := 0 to Count - 1 do begin
    Result[I].VType := vtPointer;
    Result[I].Vpointer := Items[I]^;
  end;
end; 




try
  ...
  Arr := BookmarkList.ToVarRecArray;
  FilterOnBookmarks(Arr);
finally
  Arr := nil; //<--- Now I get here EVariantArrayLockedError "Variant or  safe array is locked"
end;