RBuilder 14 is not 64-bit compatible at all
Hello everybody,
I am trying to get it running inside of 64-bit application. I tried to
create a report and immediately caught an access violation. The call stack
is below:
ppDsgner.TppDesignerWindow.SetPageActive($17794230,True,True)
ppDsgner.TppDesignerWindow.CreateControls
ppDsgner.TppDesignerWindow.Create($17794228)
ppEndUsr.TppDesigner.CreateDesignerWindow
ppEndUsr.TppDesigner.GetDesignerWindow
ppEndUsr.TppDesigner.ShowModal
In the function below it happens on the following line:
if ((lDesignModule <> nil) and (lDesignModule.Active = aActive)) then
Exit;
procedure TppDesignerWindow.SetPageActive(aPage: TPage; aActive: Boolean;
var aAllowChange: Boolean);
var
lDesignModule: TppDesignModule;
lEventParams: TppTabChangeEventParams;
begin
aAllowChange := True;
{notify the active design module of the change}
lDesignModule := GetDesignModuleForPage(aPage);
if ((lDesignModule <> nil) and (lDesignModule.Active = aActive)) then
Exit; /// EXCEPTION !!!! ////
It looks like the GetDesignModuleForPage returns an invalid object
reference. So I went to GetDesignModuleForPage. Looks correct. Then I tried
to find how the Tag value is assigned.
procedure TppDesignerWindow.CreateDesignModules;
var
...
lPage : TPage;
lDesignModule: TppDesignModule;
...
begin
...
lPage.Tag := LongInt(lDesignModule); //// WHOA !!! lPage.Tag is
NativeInt (8 bytes) while LongInt is 4 bytes long.
I fixed this code to NativeInt but immediately run into a series of other
errors. Just look at this:
class function TraTppPrintableRTTI.GetPropValue(aObject: TObject; const
aPropName: String; var aValue): Boolean;
begin
Result := True;
....
else if (CompareText(aPropName, 'DataPipeline') = 0) then
Integer(aValue) := Integer(TppPrintable(aObject).DataPipeline)
...
else if (CompareText(aPropName, 'DrawComponent') = 0) then
Integer(aValue) := Ord(TppPrintable(aObject).DrawComponent)
else if (CompareText(aPropName, 'Font') = 0) then
Integer(aValue) := Integer(TppPrintable(aObject).Font) //// INTEGER is
32 bit while TFont is 64 bit.
...
else if (CompareText(aPropName, 'LookupPipeline') = 0) then
Integer(aValue) := Ord(TppPrintable(aObject).LookupPipeline)
etc, etc, etc. They're everywhere
Any news on update?
I am trying to get it running inside of 64-bit application. I tried to
create a report and immediately caught an access violation. The call stack
is below:
ppDsgner.TppDesignerWindow.SetPageActive($17794230,True,True)
ppDsgner.TppDesignerWindow.CreateControls
ppDsgner.TppDesignerWindow.Create($17794228)
ppEndUsr.TppDesigner.CreateDesignerWindow
ppEndUsr.TppDesigner.GetDesignerWindow
ppEndUsr.TppDesigner.ShowModal
In the function below it happens on the following line:
if ((lDesignModule <> nil) and (lDesignModule.Active = aActive)) then
Exit;
procedure TppDesignerWindow.SetPageActive(aPage: TPage; aActive: Boolean;
var aAllowChange: Boolean);
var
lDesignModule: TppDesignModule;
lEventParams: TppTabChangeEventParams;
begin
aAllowChange := True;
{notify the active design module of the change}
lDesignModule := GetDesignModuleForPage(aPage);
if ((lDesignModule <> nil) and (lDesignModule.Active = aActive)) then
Exit; /// EXCEPTION !!!! ////
It looks like the GetDesignModuleForPage returns an invalid object
reference. So I went to GetDesignModuleForPage. Looks correct. Then I tried
to find how the Tag value is assigned.
procedure TppDesignerWindow.CreateDesignModules;
var
...
lPage : TPage;
lDesignModule: TppDesignModule;
...
begin
...
lPage.Tag := LongInt(lDesignModule); //// WHOA !!! lPage.Tag is
NativeInt (8 bytes) while LongInt is 4 bytes long.
I fixed this code to NativeInt but immediately run into a series of other
errors. Just look at this:
class function TraTppPrintableRTTI.GetPropValue(aObject: TObject; const
aPropName: String; var aValue): Boolean;
begin
Result := True;
....
else if (CompareText(aPropName, 'DataPipeline') = 0) then
Integer(aValue) := Integer(TppPrintable(aObject).DataPipeline)
...
else if (CompareText(aPropName, 'DrawComponent') = 0) then
Integer(aValue) := Ord(TppPrintable(aObject).DrawComponent)
else if (CompareText(aPropName, 'Font') = 0) then
Integer(aValue) := Integer(TppPrintable(aObject).Font) //// INTEGER is
32 bit while TFont is 64 bit.
...
else if (CompareText(aPropName, 'LookupPipeline') = 0) then
Integer(aValue) := Ord(TppPrintable(aObject).LookupPipeline)
etc, etc, etc. They're everywhere
Any news on update?
This discussion has been closed.
Comments
This will be fixed for RB 14.02. Thanks for the feedback. I think during
development of RB 14 some mods that were done a temp VM got lost. My fault.
-
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com