Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1791 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Lancement dynamique d'une DLL sous Delphi

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lancement dynamique d'une DLL sous Delphi

n°622851
le duke
ça vous dérange si je fume ?
Posté le 27-01-2004 à 15:07:15  profilanswer
 

Voilà je dois faire ça : pour l'instant je l'ai fait en Statique mais ce serait mieux en Dyn : alors comment que j'fais ?

mood
Publicité
Posté le 27-01-2004 à 15:07:15  profilanswer
 

n°623091
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-01-2004 à 21:19:53  profilanswer
 

- LoadLibrary qui te renvoie un THandle après avoir chargé la DLL
- GetProcAddress qui te renvoie la fonction quand tu lui donne le THandle
- FreeLibrary qui "relâche" la DLL
 

Code :
  1. type
  2.   TMaFonction = function (const AFile: ShortString; Version: Integer): Boolean;

 
(par exemple, attention si tu veux passer des paramètres AnsiString/LongString/string il faut inclure ShareMem ou FastShareMem, sachant que le premier est lent et requiert borlndmm.dll et que le second est dispo ici)

Code :
  1. var
  2.   Func: TMaFonction;
  3. [...]
  4. @Func := GetProcAddress(hDLL, PChar('mafonction'));


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°624616
le duke
ça vous dérange si je fume ?
Posté le 29-01-2004 à 10:38:27  profilanswer
 

Ben pê que ça va me servir parce que j'ai réussi à lancer ma DLL mais lors de la fermeture de celle-ci, le système appelant se ferme alors qu'il est pas sensé le faire.
 
ça c en débug, si je le fais sous windows, là windows me balance 22 message d'erreurs (je les compté : ils sont tous du style : Un exception a été crée à l'adresse 58866DTC) et l'appelant se ferme derrière.
 
Mais effectivement, je passe en paramètres un PChar plus un composant à ma sauce et pê que ta solution pourrait merservir : si t'as d'autres idées, n'hésite pas !!!!!
 
Et merci bien sur !!

n°624621
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-01-2004 à 10:44:09  profilanswer
 

C'est quoi le 'composant à ta sauces' ? parce qu'il faut faire gaffe dans ce que tu passes :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°624628
le duke
ça vous dérange si je fume ?
Posté le 29-01-2004 à 10:49:37  profilanswer
 

Ben c compliqué à dire euh ....
Disons que c'est un objet qui sert de trame de communication entre plusieurs système : le truc est rôdé depuis 5 ans donc ça vient pas de ça ....
Je viens d'essayé le FastSharemem, je l'ai mis en premier dazns les Uses de mon unité mais ça fait rien de plus .....
 
En plsu ce qu'il y a de marrant c qu'il y a déjà le débugage intégré dans delphi mais je ne vois pas les erreurs que windows me balance : sous delphi, il ne sors aucune erreur : il ferme juste le système appelant ...

n°625056
le duke
ça vous dérange si je fume ?
Posté le 29-01-2004 à 16:28:00  profilanswer
 

Vous avez pas d'autres idées ?  
Antp ?

n°625163
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-01-2004 à 17:51:58  profilanswer
 

bah je sais pas
tu passes quoi ? des objets ? on ne peut pas faire ça il me semble


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°625770
le duke
ça vous dérange si je fume ?
Posté le 30-01-2004 à 10:30:50  profilanswer
 

Ben je suis en train de me demander si ce n'est pas au niveau de ma DLL que ça pose problème et non au nivo de l'appelant.
Parce que j'ai testé avec 2 appelant différent, et le résultat est le même : mais en même temps, le code pour appeler la DLL est le même aussi : donc qd y'a pas de solution, on recommence :  
Nouvelles DLL "Printcoucou" et on vois si ça marche, ensuite ben on remplit au fur et à mesure pour voir où ça bloque !!!! (youpi ...)

n°626108
le duke
ça vous dérange si je fume ?
Posté le 30-01-2004 à 13:41:11  profilanswer
 

Bon pouyr ceux que ça intéresse, j'ai compris d'où ça venait .
 
En fait qd on lance une DLL en Dynamique, on ne peut pas passer des paramètres de types "var" ex :  
Procedure Machin(var Str : String);
Il faut faire :  
Function Machin(Const Str : String) : String;
Pour faire la même chose.
 
Seul pb : mon code présentait sous cette forme :  
 
Function toto (Var Comp : TMonComposantperso) : Integer;
Et dans cette fonction, je modifiais le 'comp' et en fonction de l'état de sortir de la function, je mettait l'integer à 0 ou 1 ou -1 ...
Là ça devient chiant parce que j'ai donc fait :  
TMycomposantamoi = record
    Comp : TMonComposantperso;
    Nb : Integer;
  End;
Function Tata(Comp : TMonComposant) : TMyCOmposantamoi;
 
Mais dans le composant TMyCOmposant j'ai déjà un object qu'il faut crée et j'ai un peu de mal : il me sort des exceptions à tout va !!!!!!!

n°626125
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-01-2004 à 13:51:57  profilanswer
 

le duke a écrit :


En fait qd on lance une DLL en Dynamique, on ne peut pas passer des paramètres de types "var" ex :  
Procedure Machin(var Str : String);
Il faut faire :  
Function Machin(Const Str : String) : String;
Pour faire la même chose.


 
:heink: heu si ça marche très bien avec var
const = var niveau type de données, sauf qu'avec const tu t'engages à ne pas le modifier
Mais comme je l'avais dit; si tu passes des string il faut que dans la DLL et dans l'exe la première unit inclue soit ShareMem ou FastShareMem.
Si l'un plante et pas l'autre c'est le hasard, mais ça risque de planter plus tard :D
 

le duke a écrit :


Mais dans le composant TMyCOmposant j'ai déjà un object qu'il faut crée et j'ai un peu de mal : il me sort des exceptions à tout va !!!!!!!


 
Comme je l'ai dit, il me semble qu'on ne peut pas passer d'objets à une DLL
Rien à voir avec le var ou pas var.
La classe TMyComposant de ton exe n'est pas la même que celle de ton DLL : ils ont chacun leurs classes.


Message édité par antp le 30-01-2004 à 13:52:40

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 30-01-2004 à 13:51:57  profilanswer
 

n°628574
le duke
ça vous dérange si je fume ?
Posté le 02-02-2004 à 14:39:47  profilanswer
 

Bon j'ai réouvert mes bouquins et dépoussiérés ma mémoire et j'ai réussi à avancer un peu :  
Je passe en paramètre un pointeur.
Donc je le passe en Const et l'affecte à un pointeur local dans ma DLL : ces 2 pointeurs vont pointer la même adresse et donc le pointeur local de la DLL va aller modifer les données à l'adresse qu'il pointe (et donc que le pointeur passé en paramètre pointe aussi)  
Donc ça marche.
 
Problème :  
Initialement ce que je voulais faire ct lancer et libéré ma DLL dans une procédure tout en local parce que sinon le lancement dynamique n'a, pour ma part, aucun intérêt.
Donc tout ce passe bien, je retrouve bien ce que j'ai modifié dans la DLL mais à la fermeture du système appelant, une erreur apparait dans le "LoadResString" de Delphi de type "violation d'accèsq blabla : ecriture à l'adresse blibli' ....
 
En fonctionnement normal, même chose : une erreur tourne en boucle et je suis obligé d'aller ds le task manager pour la stopper !!!!!
Ou alors tjs en mode normal, il me sort un truc du genre : 'la mémoire ne peut pas être read' .....
 
Si vous avez des idées ...
Je précise que j'ai mis dans le projet le fameux FastShareMem, au début des Uses o nivo de l'appelant et de l'appelé et ça ne fait strictement rien ....

n°628598
antp
Super Administrateur
Champion des excuses bidons
Posté le 02-02-2004 à 15:08:28  profilanswer
 

T'as un pointeur qui se balade qui n'est plus valable [:spamafote]
Par ex un truc qui pointe mémoire du DLL, et vu que le DLL a été viré entre temps...
FastShareMem c'est juste pour pouvoir passer des string en paramètre.


Message édité par antp le 02-02-2004 à 15:08:52

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°628719
le duke
ça vous dérange si je fume ?
Posté le 02-02-2004 à 17:17:56  profilanswer
 

Ben c bien ce que je pensais mais a priori non ....
Mais c la merde : j'y retournerai plus tard : là ça me saoule grave !!!

n°628727
antp
Super Administrateur
Champion des excuses bidons
Posté le 02-02-2004 à 17:32:38  profilanswer
 

le duke a écrit :

a priori non ....
 


 
bah pourtant si :D
elle fait quoi exactement la DLL ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°628734
le duke
ça vous dérange si je fume ?
Posté le 02-02-2004 à 17:38:29  profilanswer
 

Oh là là si tu savais !!!
En gros : en static, je lui balancais mon objet merdeux, la DLL le modifiait et me le renvoyait : ça ça marche mais à la fermeture de l'appelant ça fait chier !!!

n°628741
antp
Super Administrateur
Champion des excuses bidons
Posté le 02-02-2004 à 17:42:40  profilanswer
 

mwouais elle le modifie comment ? parce que si elle fait des allocations mémoire c'est normal que ça plante


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°628754
le duke
ça vous dérange si je fume ?
Posté le 02-02-2004 à 18:13:12  profilanswer
 

Ben non c pas normal : si tu redéclare ds la DLL un pointeur de même type que celui passé en paramètre et que tu travailles dans la DLL avec ce pointeur déclaré en global en l'ayant affecté au pointeur rentré en paramètre ds la DLL, c'est pas logique qu'il merde sur une allocation :  
les 2 pointeurs vont pointés la même pile de données donc si on utilise le pointeur avec lequel on peut modifier les données dans la pile, c bon !!
Sauf si un pointeur défini plus qu'une adresse de pile : du style une quantité de mémoire allouée.
 
Mais vu que ça ne dérange pas Delphi d'appeler 15 fois la DLL et qu'il ramène bien les valeurs modifiées, ça parait difficile de penser à cette eventualité !!
 
Donc en résumé ça fait chier et ça merde !!!

n°628774
antp
Super Administrateur
Champion des excuses bidons
Posté le 02-02-2004 à 18:50:50  profilanswer
 

heu faire pointer deux pointeurs vers un même truc c'est pas une allocation
tu fais des créations d'objets, de records, des getmem ou des trucs du genre ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°629333
le duke
ça vous dérange si je fume ?
Posté le 03-02-2004 à 09:47:34  profilanswer
 

Ben je crée les 2 pointeurs dont j'ai besoin : en fait ces pointeurs, ce sont mes objets : je simplifie parce que sinon on s'en sortira pas !!!
Dans l'objet, y'a de tout des records, des lancement de DLL statiques, des allocations (sous forme de tableau dyn) des procedures/fonctions à la pelle enfin tout ce qui va bien quoi !!

n°629509
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-02-2004 à 12:19:03  profilanswer
 

ouais mais tu simplifies trop : tu ne dis pas tout :o
si tu fais des allocations dans la DLL, il me semble que c'est normal que ça plante après avoir libéré la DLL.
Le passage de tableaux dynamiques dans des DLL je ne suis pas sûr que ce soit bon.
Pourquoi tu veux faire une DLL au fait ? :D


Message édité par antp le 03-02-2004 à 12:19:35

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°629613
le duke
ça vous dérange si je fume ?
Posté le 03-02-2004 à 13:32:24  profilanswer
 

Ben je peux pas trop t'expliquer plus parce que c un truc que j'ai à faire au boulot donc confidentialité oblige .....
 
Mais disons que cet objet sert de trame de données entre plein de systèmes de gestion de production !!
Donc c'est déjà le beau bébé !!!
Mais ce truc là fonctionne depuis 5 ans donc il est pas à mettre en doute !! Ca c pour l'objet .
Ensuite, la DLL c un programme de traitement graphique qui va remplir un petit plus la trame de donnéeset ensuite cette trame va être envoyée à un autre soft qui va à son tour la remplir et ainsi de suite.
Malheureusement je peux pas t'en dire d'une part parce que j'ai pas le droit, et d'autre part parce qu'il te faudrait 1 journée entière pour lire tout ce que j'aurais copier/coller !!!:D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Lancement dynamique d'une DLL sous Delphi

 

Sujets relatifs
[DELPHI] requete SQL : comment préciser la table de recherche ?[DELPHI] Création d'une chaine de connection à une BD ?
[Delphi 7] Récupérer tous les messages arrvant au niveau d'un TbuttonUtilisation de dbExpress sous Delphi 7
[DELPHI] Comment effacer tous les éléments d'une table ?[DELPHI] Requete SQL ? [RESOLU]
Arrondi en delphi[access][visual basic] liste de case à cocher dynamique
[delphi 6]Status imprimante via API windows...[DELPHI] TRanférer des données d'une BD à une autre !
Plus de sujets relatifs à : Lancement dynamique d'une DLL sous Delphi


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR