Skip to content

Access violation using intercept TDBXFirebirdCustomMetaDataReader.GetAllDataTypes in Win64 platform #71

@ccy

Description

@ccy

I am trying to intercept TDBXFirebirdCustomMetaDataReader.GetAllDataTypes method with these code:

uses Data.DBXFirebirdMetaDataReader, Data.DBXMetaDataReader;

var TDBXFirebirdCustomMetaDataReader_GetAllDataTypes: function(Self: TDBXFirebirdCustomMetaDataReader): TDBXDataTypeDescriptionArray = nil;

type
  TDBXFirebirdCustomMetaDataReaderHelper = class helper for TDBXFirebirdCustomMetaDataReader
    class function GetAllDataTypes_Address: Pointer;
  end;

function GetAllDataTypes_Patch(Self: TDBXFirebirdCustomMetaDataReader):
    TDBXDataTypeDescriptionArray;
begin
  Result := TDBXFirebirdCustomMetaDataReader_GetAllDataTypes(Self);
  ShowMessage('1: ' + Result[0].TypeName);
end;

class function TDBXFirebirdCustomMetaDataReaderHelper.GetAllDataTypes_Address: Pointer;
begin
  Result := @TDBXFirebirdCustomMetaDataReader.GetAllDataTypes;
end;

procedure TForm94.Button1Click(Sender: TObject);
begin
  var a := TDBXFirebirdCustomMetaDataReader.Create;
  var b := a.AllDataTypes;
  ShowMessage('2: ' + b[0].TypeName);
end;

initialization
  TDBXFirebirdCustomMetaDataReader_GetAllDataTypes := InterceptCreate(TDBXFirebirdCustomMetaDataReader.GetAllDataTypes_Address, @GetAllDataTypes_Patch);
finalization
  InterceptRemove(@TDBXFirebirdCustomMetaDataReader_GetAllDataTypes);
end.

The above code works on Win32 platform but fail with access violation in Win64 platform.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions