2017-04-17 4 views
1

J'ai une ancienne application qui a toujours bien fonctionné. Récemment, il a commencé à lancer l'exception EAccessViolation dans la méthode FilterOnBookmarks. Je ne sais pas quand cela a commencé, peut-être quand je le reconstruis sous XE 10.1.TCustomADODataSet.FilterOnBookmarks

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; 

je créer des signets paramètres de la méthode FilterOnBookamrks comme un tableau de TVarRec:

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; 

Ce code a travaillé pendant des années. Est-ce que quelque chose a changé dans 10.1 XE concernant FilterOnBookmarks, Bookmarks, etc?

Répondre

1

Le problème n'est pas dans Delphi. Nous avons le même problème. Voir: https://answers.microsoft.com/en-us/windows/forum/windows_7-update/windows-10-update-kb4015217-windows-7-update/d6ee5ee8-a362-48fd-be1d-26a6b6526c34 Le problème est, C: \ Program Files (x86) \ Fichiers communs \ System \ ado \ msado15.dll après une mise à niveau récente. Si vous remplacez msado15.dll par ceux avant la mise à niveau, l'application fonctionne correctement.

+0

Avez-vous trouvé la solution? (sans changement d'application) Nous avons le même problème, nous ne pouvons pas changer l'application. Je vous remercie – user3648935

+0

Merci, @ user3648935! Est-ce que le fait de placer l'ancienne version de msado15.dll dans le répertoire de travail de l'application résout le problème? Où puis-je le trouver? –

0

Nous avons temporairement résolu le problème. Nous avons remplacé msado15.dll dans C: \ Program Files (x86) \ Fichiers communs \ System \ ado Nous avons pris msado15.dll à partir d'un ordinateur qui n'a pas été mis à niveau.

+0

Merci beaucoup, @ user3648935! –