j'ai supprimé le far et pourtant le même probleme reside...
j'ai supprimé le far et pourtant le même probleme reside...
Essayes quand même mon truc de tout à l'heure avec les variables globales.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 library ED_DLL; uses ShareMem, Dialogs, SysUtils, Classes, Windows, FM_Main in 'FM_Main.pas', FM_Options in 'FM_Options.pas' {F_Options}, U_Constantes in 'U_Constantes.pas', U_OptionsValues in 'U_OptionsValues.pas', FM_Params in 'FM_Params.pas' {F_Params}, FM_About in 'FM_About.pas' {F_About}, U_Obligation in 'U_Obligation.pas', U_SwapTaux in 'U_SwapTaux.pas', U_TCN in 'U_TCN.pas', U_PretEmprunt in 'U_PretEmprunt.pas', U_ValMob_OLF in 'U_ValMob_OLF.pas', U_ObjectTypes in 'U_ObjectTypes.pas', U_ObligationConvertible in 'U_ObligationConvertible.pas', FM_Recap in 'FM_Recap.pas' {F_Recap}, U_PJJ in 'U_PJJ.pas', U_CFD in 'U_CFD.pas', FM_SendTicketsUnitaires in 'FM_SendTicketsUnitaires.pas' {F_SendTicketsUnitaires}, U_TRS in 'U_TRS.pas', U_ValMob_OLF_Sophis in 'U_ValMob_OLF_Sophis.pas', U_SwapChange in 'U_SwapChange.pas', U_ChangeSpotTerme in 'U_ChangeSpotTerme.pas', U_SwiftMT304 in 'U_SwiftMT304.pas', U_Tools in 'U_Tools.pas', U_CDS in 'U_CDS.pas', U_Options_CDS in 'U_Options_CDS.pas', U_OptionChange in 'U_OptionChange.pas', U_VarSwap in 'U_VarSwap.pas', U_OptionOTC in 'U_OptionOTC.pas', U_DividendSwap in 'U_DividendSwap.pas', U_Outperform in 'U_Outperform.pas', U_CapFloor in 'U_CapFloor.pas', U_Swaptions in 'U_Swaptions.pas', U_SwapEquities in 'U_SwapEquities.pas'; {$R *.res} var GExportType : Integer; GListrefcon : Pchar; GDestinationType: Integer; GMajStatuts, GchoixRepertoire : Boolean; GRepertoireCible : Pchar; GCreerUnitaire : Boolean; procedure CallBackExportToFile(ExportType : TFileType; Listrefcon : Pchar; DestinationType: TDestType; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; external 'exportdeals.exe'; function TypeExport(TE : Integer): TFileType; stdcall; begin case TE of 1: Result:= ftCreation ; 2: Result:= ftModification; 3: Result:= ftAnnulation; //else MessageDlg('Votre type d export n est pas valide!', mtError, [mbOk], 0); end; end; function TypeDest(TD : Integer): TDestType; stdcall; begin case TD of 1: Result:= dtDepositaire; 2: Result:= dtValorisateur; 3: Result:= dtPrimeBroker; //else MessageDlg('Votre type destination n est pas valide!', mtError, [mbOk], 0); end; end; procedure ProcExportDll(ExportType : Integer; Listrefcon : Pchar; DestinationType: Integer; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; var j,k: integer; begin j:=ExportType; k:=DestinationType; GExportType := ExportType; GListrefcon := Listrefcon; GDestinationType := DestinationType; GMajStatuts :=MajStatuts; GchoixRepertoire := choixRepertoire; GRepertoireCible := RepertoireCible; GCreerUnitaire := CreerUnitaire ; CallBackExportToFile(GTypeExport(j), GListrefcon, GTypeDest(k), GMajStatuts, GchoixRepertoire, GRepertoireCible, GCreerUnitaire); end; exports ProcExportDll; begin end.
Je ne crois pas qu'on puisse definir une fonction callback de cette facon:
ici on dit a la dll de charger un nouveau exportdeals.exe en memoire et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure CallBackExportToFile(ExportType : TFileType; Listrefcon : Pchar; DestinationType: TDestType; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; external 'exportdeals.exe';
de trouver l'adresse de la fonction CallBackExportToFile....humm ... désolé mais les mots
me manque pour être plus claire...
Pour une fonction callback, d'Habitude le exe appele une fonction à l'intérieur de la dll
qui mémorisera tout simplement l'adresse de la fonction callback....
un truc du genre dans le programme appelant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 type TCallBackfunc=procedure (ExportType : TFileType; Listrefcon : Pchar; DestinationType: TDestType; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; pCallBackFunc=^TCallBackFunc; procedure SetCallBackProc(cbFunc:pCallBackFunc); stdcall; external 'MyDll.dll'; //=== Passe l'adresse de notre fonction Callback à la DLL SetCallBackProc( CallBackExportToFile );
Ensuite dans la dll:
bon c'est peut-être moi qui à manqué un bout quelque part?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 type TCallBackfunc=procedure (ExportType : TFileType; Listrefcon : Pchar; DestinationType: TDestType; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; pCallBackFunc=^TCallBackFunc; var //==Variable globale pour mémorisé l'adresse de la function...== CallBackFunc:pCallBackFunc; procedure SetCallBackProc(cbFunc:pCallBackFunc); stdcall; begin //==Memorise la fonction callback qui vient du exe....== CallBackFunc:=cvFunc; end; //== alors plus tard dans la dll... on peut appeler la bonne procedure....=== ProcExportDll(ExportType : Integer; Listrefcon : Pchar; DestinationType: Integer; MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar; CreerUnitaire : Boolean); stdcall; var j,k: integer; begin j:=ExportType; k:=DestinationType; //== Verifie que la variable global est bien assigné à quelque chose...== if CallBackFunc<>nil then CallBackFunc(TypeExport(j), Listrefcon, TypeDest(k), MajStatuts, choixRepertoire, RepertoireCible, CreerUnitaire); end; //=== Il faut bien sur exporter notre nouvelle fonction === exports ProcExportDll; SetCallBackProc;
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
J'ai plus l'impression que c'est un abus de langage, dans le sens CallBack -> Redirection, que dans le sens EnumWindows, par Exemple ...Envoyé par Eric Boisvert
"Exe en C++" appel "DLL en Delphi" qui encapsule si j'ai compris un "Exe en Delphi) ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
je vais suivre cette discussion avec attention alors...Envoyé par ShaiLeTroll
j'vais peut-être même tenter une experience toute simple...
si ca fonctionne, ca simplifie drôlement l'écriture d'un call back...
J'en reviens tjrs pas! je m'y attaque tout de suite...
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Sa fonction CallBackExportToFile n'est pas une fonction de Callback.
Son appli C++ manipule et crée des données qui sont transmise à une fonction contenue dans la Dll.
Cette fonction, qui sert de controleur en quelque sorte, transfert les données à un exe en Delphi qui stoque ou traite les données.
Mais le probleme vient effectivement probablement de sa déclaration ...stdcall; external 'exportdeals.exe';
Jamais essayé ce genre de truc (Borland préconisait l'usage des paquets avec le support RTTI)
Mais alors, un programme peux caller une fonction contenue dans un autre programme!? !
ils n'ont pas de pile commune...dans ce cas... c'est donc impossible?non?
ou alors justement la dll traite le fichier .exe comme une dll? mais c'est impossible?
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
où est dll_entry proc dans un .exe?
Je crois que ca ce tient pas debout cette structure? Ou bien je suis dans
le champs completement depuis toujours?
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Je n'ai jamais essayé, mais j'ai vu d'autres sujets qui parlait d'exports sur un exe, faudrait que je le tente un jour, ... mais semble que certains l'utilisent ...
maintenant, ce qui me semble étrange c'est le link, perso, je n'utilise que rarement la syntaxe external ... comme dans l'unité Windows mais un truc du genre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function TFrmTestDivers.GetBidule(out ...): Boolean; var HandleDLL: HMODULE; _GetBidule: procedure(...); stdcall; begin HandleDLL := LoadLibrary('DLLTest.dll'); if HandleDLL > 0 then begin @_GetDLLForm := GetProcAddress(HandleDLL, 'GetBidule'); Result := Assigned(@_GetDLLForm) if Result then _GetDLLForm(...); end; end;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
la syntaxe external fait essentielement la même chose que toi ShaiLeTroll.
Seulement elle le fait automatiquement pour toi lors du lancement de
l'application....c'est pourquoi je disais tantôt qu'on ne peux définir une
fonction callback de cette facon....(avec external).
Comme on voit dans ton code, c'est une autre copie du .exe qui sera
loader en mémoire... donc pour un callback... c'était sûrment pas l'effet
désiré...
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Eric Boisvert, Quand je parlais d'abus de langage, c'est l'utilisation d'un mot pour ce qu'il ne veut pas dire !
dans ce cas, je pense que cela n'est pas du tout un CallBack, il a utilisé ce terme à mauvais escient ! c'est plus une redirection, non un Encapsulation de sa function dans l'Exe par une fonction dans une DLL
Sinon, je connais le principe du External, dans le journal d'évènement, c'est la déprime quand je vois tant de DLL lancé par les applis du bureau, pour des fonctionnalités, qui ne sont pas utilisé plus d'une fois par mois ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Maintenant on s'entend très bien là dessus!Envoyé par ShaiLeTroll
pour le reste, selon moi, il faudrait penser à une communication
inter-processus entre la DLL et le programme Delphi... sinon, je vois
vraiment pas comment ca peut fonctionner comme ca....
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Sinon, as tu pensé à écrire dans un Fichier Log ou dans OutputDebugString, le contenu de tes variables, pour éviter la visualisation du débugger delphi, qui se trompe parfois (FileStream.Size internellement à zéro par exemple)
Et, je ne sais pas pour les autres, mais c'est difficile de trouver l'erreur, sans avoir des debbugers sous la main, ... tu devrais tout remettre à plat, et revoir tout depuis le début, ... procédé, étape par étape ... pour trouver la faille, si cela se trouve, c'est un truc aussi bête que le Boolean au lieu de LongBool ... mais personne ne le voit ... Bon WE à Tous ... A Mercredi !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Bonjour,
=>ShaiTrol, j'ai essayé ton truc des variables globales, mais les variables sont éliminés lors de l'appel de la fonction qui se trouve dans l'exe...
Précisions: Comme je l'ai déjà indiqué, mon programme a marché nickel lors de l'appel depuis l'exe mais depuis un prog C++ ca ne marche pas car les vraibales sont eliminé juste au passage à la fonction qui se trouve dans l'exe delphi!!!
Je ne crois pas que c'est l'utilisation de export 'expordeals.exe' qui pose problème. En plus, ma fonction callback... a bien son role, c'etait en fait pour encapsuler le comportement de l'exe qui depend d'un type TForm et donc que je ne peux pas appeler depuis ma dll.
Voilà, si vous avez des idées je vous en serias reconnaissant, car làà je n'ai plus d'idées a tester
Je tiens a noter une chose qui est tres importante aussi: Quand je teste ma dll en l'appelant depuis l'exe même, j'ai dis que ça marche, en fait ce qui est étrange c'est que quand je regarde le contenu des variables au moment de l'appel, Je tourve la meme chose "symbol was eliminated by linker"!!!!!!!!!!!!!!!!!! alors que ca marche tres bien. cela veut dire que ca peut ne pas etre le blem ce truc?
alors quelqu'un voit il où c'est le problème SVP?? En fait j'ai trouvé une discussion qui peut m'être utile, mais c'etais en néerlandais
Bon si kelkun conné hollandais voila le lien:
http://www.nldelphi.com/forum/showthread.php?t=16209
ou ceci aussi:
http://www.nldelphi.com/forum/showthread.php?t=1898
Merci d'avance les gas
Désolé mais je comprend rien au néerlandais moi non plus!
Bon voilà en gros ce que j'ai dans la tête à propos de ton problème...
alors je t'invite à utiliser la 2ème proposition...Envoyé par MSDN
ici en anglais la théorie:
Fichier mappés en mémoire
Commence par une recherche sur les fichier mappés...
les fonctions API utile dans les fichier mappés sont:
CreateFileMapping
MapViewOfFile
UnMapViewOfFile
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Merci, ca donne espoir au moins
Bon je vais voir ce document et ce qu'il peut me donner
Je t'ai déjà expliqué deux fois que ça ne pouvait pas marcher !
D'où la méthode que j'ai passé quelques heures bénévoles à implémenter, et qui utilise le DDE. Mais apparemment cette méthode te déplaît. Tant pis.
Voici tout de même une petite exemple...2 programme 1 dllEnvoyé par CapJack
il y a echange de données via un fichier mappé en mémoire.
Je démontre aussi la limite des callback...
Cela dit, je crois qu'il faut absolument que tu revois la structure des liens
entre tes programmes et que tu étudie en détail le comportement des
fichiers .dll....
et il semblerait que CapJack est d'accord avec moi!
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
J'ai bien vu ta methode DDE, mais d'apres ce que j'ai compris c'est que cette méthode est utilisé lors de l'appel depuis Delphi même non?? me suis je trompé.. Ne t'enerve pas CAPJACK car je suis que débutant en delphi...Envoyé par CapJack
Un grand merci Quand même
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager