Access violation using intercept TDBXFirebirdCustomMetaDataReader.GetAllDataTypes in Win64 platform
ccy opened this issue · 0 comments
ccy commented
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.