2017-04-17 1 views
1

나는 항상 잘 작동하는 오래된 응용 프로그램을 가지고 있습니다. 최근에는 FilterOnBookmarks 메서드에서 EAccessViolation 예외가 throw되기 시작했습니다. 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; 

나는 TVarRec의 배열로 FilterOnBookamrks 방법의 즐겨 찾기 매개 변수를 만들 :이 코드는 년 동안 일하고있다

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; 

. FilterOnBookmarks, Bookmarks 등과 관련하여 10.1 XE에서 변경된 사항이 있습니까?

답변

1

문제는 Delphi에서 발생하지 않습니다. 같은 문제가 있습니다. 참조 : https://answers.microsoft.com/en-us/windows/forum/windows_7-update/windows-10-update-kb4015217-windows-7-update/d6ee5ee8-a362-48fd-be1d-26a6b6526c34 최근 업그레이드 후 C : \ Program Files (x86) \ Common Files \ System \ ado \ msado15.dll 에이 문제가 발생했습니다. msado15.dll을 업그레이드 전의 것으로 대체하면 응용 프로그램이 제대로 작동합니다.

+0

해결책을 찾았습니까? (앱 변경없이) 동일한 문제가 있으며 앱을 변경할 수 없습니다. 감사합니다. – user3648935

+0

감사합니다. @ user3648935! msado15.dll의 이전 버전을 응용 프로그램 작업 디렉토리에 저장하면 문제가 해결됩니까? 어디에서 찾을 수 있습니까? –

0

일시적으로 문제가 해결되었습니다. 에있는 msado15.dll을 대체했습니다. C : \ Program Files (x86) \ Common Files \ System \ ado 업그레이드되지 않은 컴퓨터에서 msado15.dll을 가져 왔습니다.

+0

고마워, @ user3648935! –