Dll support: testers needed
Andre Pany
andre at s-e-a-p.de
Tue Jan 9 20:07:03 UTC 2018
On Tuesday, 9 January 2018 at 18:32:24 UTC, Benjamin Thaut wrote:
> Am 09.01.2018 um 16:03 schrieb Andre Pany:
>> [...]
>
> First let me say that what you are describing is a very
> uncommon and ill-advised use case. As such there is not going
> to be any nice to use workflow to acieve what you are trying to
> do. Still this doesn't mean that it won't be possible.
>
> Why ill-advised? What you're describing is a cyclic dependency
> between your main executable and your dll written in delphi. If
> you google for "cyclic dependency dll" you will usually get the
> advice to break your cylic dependency by splitting your code
> into more dlls. My personal experience shows the same. Cyclic
> dependencies in dlls are usually not worth the additional
> effort and hassle. Also you want to export things from your
> executable, which is also very uncommon. What you should be
> doing is having 2 dlls and one executable. You have one common
> library written in D that is build into a dll. Then you have
> your delphi library which uses the common.dll. Finally you have
> your main executable written in D which uses both the
> common.dll and your delphi.dll. This should make it possibly to
> break the cycle and get you an easy setup.
>
>
> If you absolutley must do it the way you describe it, its still
> possible. You will have to compile all modules that export
> something from your executable with the "-c -shared"
> parameters. E.g.
> dmd -m64 -c -shared moduleThatExports1.d moduleThatExports2.d
> -ofexports.obj
>
> Now you link the resulting exports.obj file into your
> executable by calling dmd again
>
> dmd -m64 restOfModules.d exports.obj delphi.lib -ofmain.exe
>
> Finally you have to get the handle to your main executable by
> calling
>
> HMODULE handle;
> GetModuleHandleExA(0, null, &handle);
>
> in your delphi dll and then fetching the function pointer for
> each and every function you want to call from delphi via:
>
> GetProcAddress(handle, "mangeledFunctionSymbol")
>
> Now finally you can call these functions pointers from delphi
> and they will call into the D code within your executable.
>
>
> Instead of all that hassle you could instead just have a
> function in your delphi dll:
>
> void recieveFunctionPointer(const(char)* name, void* ptr);
>
> which you call for every function that you want to make
> available from D to delphi. Your delphi code then stores away
> these pointers depending on the name. That way you don't need
> to export anything from your executable and can build it
> normally. Instead of having a function call per function you
> could obviosuly also use a struct that is defined the same way
> in D and delphi and contains all relevant functions pointers.
Thanks for your deep analysis. There are several reasons I want
to have the exe as Delphi application:
1) I faced some minor (Delphi) IDE/Libraries bugs with having the
Delphi gui within a dll.
2) The Delphi IDE provides you the possibility to e.g. easily
change the exe icon/attach additional resources to the exe, ...
3) Delphi lets you also create android/iPhone applications. I
assume there will be no other way than place the D coding within
a shared object for this scenario.
I completely agree with you, it is mad. My gut feeling is, you
have the greatest benefit from the IDE and convenience if the
executable is written in Delphi.
I try to support both ways in my library, so the developer can
decide.
Kind regards
Andre
More information about the Digitalmars-d
mailing list