Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
prog:lazarus:cas:dll:dll [17/03/2023 12:28] thierry [Sources & Ressources] |
prog:lazarus:cas:dll:dll [18/03/2023 18:42] (Version actuelle) thierry [Partage d'object entre DLL et EXE] |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Partage de mémoire entre le programme et la DLL\\ | Partage de mémoire entre le programme et la DLL\\ | ||
-> [[https://www.freepascal.org/docs-html/rtl/sharemem/index.html]] | -> [[https://www.freepascal.org/docs-html/rtl/sharemem/index.html]] | ||
+ | |||
+ | Pour partager la mémoire entre programme et DLL on doit inclure l'unité ''sharemem'' dans la clause ''uses'' de l'''exe'' et de la ''dll''\\ | ||
+ | Et on doit livrer avec l'exe et la dll, la DLL ''fpcmemdll.dll'' dont le code source se trouve sous ''fpcsrc\rtl\win'' | ||
+ | |||
+ | ===== Partage d'object entre DLL et EXE ===== | ||
+ | Apparemment ce n'est pas possible/conseillé | ||
+ | |||
+ | Certain préconise d'utiliser des [[prog:lazarus:cas:interfaces|Interfaces]] pour résoudre ce problème. | ||
+ | |||
+ | |||
+ | ===== Qu'en dit ChatGPT ? ===== | ||
+ | |||
+ | J'ai posé la question : "Je programme avec Free Pascal, peut on partager un objet entre un exe et une dll" à ChatGPT, voici sa réponse. | ||
+ | |||
+ | Oui, il est possible de partager des objets entre un programme exécutable et une bibliothèque dynamique (DLL) dans Free Pascal. Voici quelques étapes générales que vous pouvez suivre pour le faire : | ||
+ | |||
+ | Créez votre objet et compilez-le en tant que bibliothèque dynamique (DLL) en utilisant la commande "{$MODE OBJFPC}" et "{$H+}" pour activer les gestionnaires de mémoire partagée. | ||
+ | |||
+ | Exportez les symboles de l'objet en utilisant la directive "exports" pour que les programmes utilisant la DLL puissent accéder aux objets. Par exemple : | ||
+ | |||
+ | <code delphi> | ||
+ | library MyObject; | ||
+ | |||
+ | uses | ||
+ | MyObjectUnit; | ||
+ | |||
+ | {$MODE OBJFPC} | ||
+ | {$H+} | ||
+ | |||
+ | exports | ||
+ | MyObjectFunction; | ||
+ | |||
+ | begin | ||
+ | end. | ||
+ | </code> | ||
+ | Dans votre programme exécutable, incluez l'interface de l'objet en utilisant la directive "external". Par exemple : | ||
+ | <code delphi> | ||
+ | program MyProgram; | ||
+ | |||
+ | uses | ||
+ | MyObjectUnit; | ||
+ | |||
+ | {$MODE OBJFPC} | ||
+ | {$H+} | ||
+ | |||
+ | var | ||
+ | MyObject: TObject; | ||
+ | |||
+ | external 'MyObject.dll'; | ||
+ | |||
+ | begin | ||
+ | MyObject := TObject.Create; | ||
+ | // Utilisez l'objet MyObject ici | ||
+ | end. | ||
+ | </code> | ||
+ | Compilez votre programme exécutable en utilisant la bibliothèque dynamique (DLL) que vous avez créée dans l'étape 1. | ||
+ | Il est important de noter que lorsque vous partagez des objets entre un programme exécutable et une DLL, vous devez faire attention à la gestion de la mémoire partagée. Vous devrez peut-être utiliser des fonctions spéciales pour allouer et libérer la mémoire partagée afin d'éviter des problèmes de corruption de mémoire ou de fuite de mémoire. | ||
+ | |||
+ | Personnellement je pense que c'est du bullshit, mais je met ce texte ici pour l'analyser ultérieurement... | ||
+ | |||
====== Sources & Ressources ====== | ====== Sources & Ressources ====== | ||
* [[http://bbb-amibroker.blogspot.com/2015/07/write-dll-with-lazarus-free-pascal_9.html]] | * [[http://bbb-amibroker.blogspot.com/2015/07/write-dll-with-lazarus-free-pascal_9.html]] | ||
Ligne 8: | Ligne 68: | ||
* [[https://wiki.freepascal.org/Lazarus/FPC_Libraries]] | * [[https://wiki.freepascal.org/Lazarus/FPC_Libraries]] | ||
* [[https://wiki.freepascal.org/shared_library]] | * [[https://wiki.freepascal.org/shared_library]] | ||
+ | * [[https://delphi.developpez.com/faq/?page=DLL#Comment-partager-un-objet-entre-un-executable-exe-et-une-DLL]] | ||
+ | * [[https://www.developpez.net/forums/d355094/environnements-developpement/delphi/placer-tform-tframe-cree-dll/]] | ||