[fpc-devel] FPC dynamic libraries

Michael Van Canneyt michael at freepascal.org
Thu Feb 8 14:32:18 CET 2007



On Thu, 8 Feb 2007, Daniƫl Mantione wrote:

> 
> 
> Op Thu, 8 Feb 2007, schreef Michael Van Canneyt:
> 
> > > Design a plugin binary API, dynload the plugin. It is not necessary that 
> > > the RTL is shared for this purpose (allthough it could reduce the size).
> > > 
> > > This way you only have to keep the plugin API backwards compatible, 
> > > and could allow binary plugins to be used with any Lazarus version. 
> > > Keeping a plugin API compatible is very doable, unlike of the full RTL, FCL 
> > > and LCL, which seems next to impossible to me.
> > 
> > Why ?
> 
> There is OOP code in those libraries. The slightest code modification will 
> change the layout of the VMT.

Yes.

> 
> > Borland does it.
> 
> Borland does not. Each Delphi version has its own BPL packages, for 
> example you have vcl50.bpl. The only reason it is workable with Delphi is 
> that they don't release very often.

Exactly. 
Neither does FPC. Not an offical release, anyway. 
We don't release that much more often as Borland.

> > Secondly, there are serious problems with this approach which make it unusable
> > for an IDE like Lazarus.
> > 
> > Assume I get a component instance from the plugin (MyObject), then extremely 
> > simple and basic statements like
> > 
> > If (MyObject is TComponent) then
> >   XYZ
> > 
> > will fail, even though MyObject is a TComponent, because the VMT of the 
> > MyObject TComponent parent resides in the library, and the VMT of TComponent
> > used in the If statement is inside Lazarus, causing the statement to fail, 
> > even though it should be true. When using packages, the statement will function
> > correctly.
> 
> I was talking a binary API, and that automatically disallows sending 
> classes through the API, because you want to prevent that an internal 
> change breaks your external API. Simply design the API in a proper way.

You can't, for Lazarus. You need the classes, that's what you need the
plugins for in the first place: to install additional components on the 
component palette. They must descend from the TComponent which is in
the IDE.

There is no way around it.

> > The only option are packages, and packages need an RTL in a dynlib.
> > That this requires a strict versioning schedule, is part of the deal. 
> 
> Indeed, and because this is not a workable solution, just count the 
> number of changes in the VCL, a proper designed binary API is what you 
> need.

I understand that, but this is not usable at all for an IDE based on class 
components.

> 
> > Borland's packages are also incompatible between released versions.
> 
> Sure, but above you said Borland keeps them compatible.

With this I mean that they release not so often that it becomes a problem.
if they would release every 3 weeks, it's a problem, this is obvious.

Lazarus will have to do the same if they want to have dynamically loadable
packages. 

Michael.


More information about the fpc-devel mailing list