[Lazarus] "Running" a library
Mark Morgan Lloyd
markMLl.lazarus at telemetry.co.uk
Sat Sep 15 12:36:01 CEST 2012
Sven Barth wrote:
>> /Why/ can't a library be run standalone? We're already at the position
>> that an executable can decide whether it's been invoked from a shell or
>> the GUI and behave as appropriate, so why can't it decide whether it's
>> being run as a program or being initialised as a library?
>
> A library and an application have different entry point signatures. Take
> Windows for example. There the entry point for applications is
> "procedure EntryPoint; stdcall;" while for DLLs it is "procedure
> EntryPoint(aHinstance: PtrInt; aDLLReason: Word; aDLLParam: Pointer);
> stdcall;". Additionally the entry point of a DLL is called multiple
> times (once the process loads the library, every time a new thread is
> created and destroyed and once the process unloads the library) while
> the entry point of an application is only called once. Also AFAIK
> Windows does not let you run binaries that are flagged as "DLL". That's
> the reason why there is a program called "rundll32" ;) [though it
> expects an exported function with a certain signature...]
Assuming for a moment that a binary can be built that is basically an
executable but also exports library-style entry points, and which could
be loaded into memory using DynLib or whatever: could the initialisation
function be told to return fast and cleanly if it detected that it
wasn't being run as a program? In that case, the caller could use DynLib
to load it and then invoke a different entry point explicitly to handle
initialisation.
Hypothetical case in which this sort of thing could be useful: if run as
a program the library outputs a .inc or .h file describing its exports.
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
More information about the Lazarus
mailing list