J'ai un mega probleme de dll ll ll lll bouuuuuuu[:(] [Résolu]

Signaler
Messages postés
27
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
16 février 2008
-
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005
-
Voila j'ai un problème de dll.
Ok avant de commencé je tenait juste a dire que je n'ai pas mit la source entière car ce serait trop long , de plus le code marcher nickel.
Tout d'abord il faut savoir que toute le code de la dll était compris dans l'exe , vu la taille que commencé a prendre l'exe ,j'ai décidé de de crée une dll (pour des éventuel MAJ aussi)
mais maintenant j'ai un mega beug, le truc c que tout est bien déclaré car j'ai aucune erreur de compilation, les lien du prog vers la dll sont correcte (charger statiquement).
J'ai essayer avec plusieurs directives différente (stdcall , external,??.),mais le bug y est toujours.
Donc je m?explique j'ai une erreur de « violation d'accès », elle ce fait au niveau du begin de la dll « * ».
j'ai remarqué ca en mode débuggeur, car au début je pensais que ct la déclaration au niveau de l'exe.
le chargement ce passe bien puis le debug ce mais sur la ligne begin j'appuis F7 et la je vous le donne en mille ........ca plante.
Si qq?un peut m?aider ??? ça m?aiderait énormément :) J
Je sais que j'ai était avare en code mais avec les plusieurs centaine de ligne de code que comprend le prog (il ettai temp de ce metre au dll mon p'tit gars) ça n'aurais pas arrangé la chose?
Merci d'avance...

//la dll

library AvidataInfo;

uses
Windows,
MMSystem,
Messages,
SysUtils,
Classes,
StrUtils,
FMTBcd,
QDialogs,
vfw;

type
?

var
?

const
?.

exports
Return_Name,
Return_Index,
Recup_Avi_Info,
Return_length_Codec,
return_Correspondance_Codec;
{$R *.res} //j'ai changer pas mal de fois cette instruction de place car j'ai regarder différente // source et ce n'était jamais mit au même endroit

begin * %-6 (c la que ca plante)
end.

//le P.P. (exe)
unit V_Shop;

interface

uses
// toutes les declaration

type
?
var
?
Function Recup_Avi_Info(FFile : ShortString;Info:pointer): Boolean; external 'AvidataInfo.dll';
Function Return_Name(index : ShortString;typecodec : integer) : ShortString; external 'AvidataInfo.dll';
Function Return_Index(Name : ShortString;typecodec : integer) : ShortString; external 'AvidataInfo.dll';
Function Return_length_Codec(Types : integer):integer; external 'AvidataInfo.dll';
Function return_Correspondance_Codec(Types : integer;Index1,Index2 : integer):ShortString; external 'AvidataInfo.dll';
?..
ET PUIS TOUT LE RESTE

Ps:un franchement grand supeeer gros merci a "codes-sources" pour leurs sites, ils mon pal mal aidé.

10 réponses

Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

oups ,j'ai répondu trop tard !

Le mieux ici , c'est de simplifier la donne oui ,en commançant par le début ,la dll n'est pas correctement chargé.

Je te conseille donc de refaire une nouvelle dll simple telle que proposé plus haut.

ensuite de la copier dans le répertoire d'un nouveau projet pour en tester le chargement.

ensuite dans le projet on inclus le nom de la fonction que l'on souhaite utilisé:

function Double(I:Integer):Integer;stdcall;external 'votredll.dll';

pour m'a part il n'y a aucun problème si la dll se trouve dans le répertoire même ou dans system32 sous xp

yve
Messages postés
147
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
26 avril 2008

Salut, j'ai deja eu des problemes avec les dll, dus aux options de compilations (Projet/Options/Compilateur) :

Il faut tout décocher, puis cocher toutes les cases de Géneration de Code (Optimisation, Cadre et Pentium Sécurisé). Puis dans Options de syntaxe cochers seulement Syntaxe étendue et Constantes typées affectable. Tout le reste de la fenetre doit rester decoché.

Bonne chance

PS: Pense au StdCall dans des declarations externes.
Messages postés
27
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
16 février 2008

Merci pour ta reponse zmc, je pense que ca va pouvoir m'etre utile mais plus tard...(je vient d'essayer mais ca ne marche pas, j'ai essayer sur les options de la dll puis sur celle du projet puis les 2 en meme tmp bouuuuuuuu)...

en faite aprés beaucoup de recherche j'en conclu que c l'appel de la fonction qui plante.

je m'explique :
j'ai recréé un nouveau projet en important le projet dll dedant,
j'ai enlever toute les fonction, declaration etc.... sauf une fonction,
j'ai meme modifier les parametre de cette fonction pour n'avoir que des integers,donc pour en venir a un truc completement batard, une fonction qui sert a rien puisque j'ai aussi mit toute ces instruction en commentaire.
donc
- sur le projet exe je la declare jusqu'a la pas de prob de compilation,
- je fait un appel a la function via un bouton, pas de probleme de compil mais quand je run, ca plante dès le depart si j'enleve l'appel a la function du bouton . . . la le prog ce lance sans probleme.

j'ai donc l'impression que j'ai un probleme de declaration ou je sais pas quoi , . . . . . . . . . en faite j'en sais rien ?-)

Merci d'avance. . .
Messages postés
147
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
26 avril 2008

Toutes tes fonctions plantent ou c'est "simplement" celle-ci ?
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

Même si vous planifiez d'utiliser la dll qu'avec delphi, vous ne pouvez envoyer les strings ou les tableaux dynamiques vers la dll sans prendre quelques précautions.

Ceci parce que delphi s'occupe seul de l'allocation de mémoire (new,free,nil).

La solution à ce problème est d'inclure l'unité ShareMem à la dll ainsi qu'aux programmes qui l'utiliseront.

La dll devrait être dans le même répertoire que le exe qui l'utilise ou dans le répertoire system de windows.

Vous pouvez donc vérifier si l'application trouve la dll comme ceci:

Creer une nouvelle application ,avec la fiche 1 ajouter 1 bouton
et un événement OnClick ce qui devrait donner ceci et recopier ensuite le reste du code:

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Déclarations privées }
public
procedure test;
end;

type
TIntFonction = function(I:Integer):Integer;stdcall;

const
DllName ='votredll.dll';
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.test;
var
Hinst:THandle;
FPointer:TFarProc;
maFonction:TIntFonction;
begin
HInst := SafeLoadLibrary (DllName);
if HInst > 0 then
try
FPointer := GetProcAddress (HInst,
PChar ('Double'));{nom de la fonction sans aucun params}
if FPointer <> nil then
begin
// Fonction trouvé
end
else
ShowMessage ('fonction DLL non trouvé.');
finally FreeLibrary (HInst);
end
else
ShowMessage (DllName + ' non trouvé.');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
test;
end;

end.

Ceci est un chargement de la dll lors du click du bouton donc c'est une façon de charger la dll en runtime.

Vous pouvez ensuite déplacer la dll du répertoire courant et la placé dans le répertoire system de windows et refaire le test.

L'idée ici c'est de comprendre qu'en run time ou par un appel conventionnel delphi ne fait que se référer à un pointeur.Or même si le programme se compile sans erreur ,cela ne veut pas explicitement dire que la dll sera chargé correctement au lancement de l'application.

Habituellement,si la dll doit-être utilisé ,le fait de lancer l'application provoque une erreur .

à ce que je puisse comprendre du problème ici nul besoin de ce begin
end;

les fonctions étant situé dans d'autres sous unité.
voici donc une simple dll qui pourrait-être construite avec delphi
nouveau/expertDll

library votredll.dll;

uses
ShareMem, SysUtils, Windows;

function Double (N: Integer): Integer; stdcall;
begin
Result := N * 2;
end;

exports

Double;

end.

or si d'autres fonctions doivent être exporté simplement ajouter leur nom dans la partie exports et inclure dans la partie uses les unités où se retrouvent ces fonctions.

Double,
Return_Name,
Return_Index,
Recup_Avi_Info,
Return_length_Codec,
return_Correspondance_Codec;

yve
Messages postés
27
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
16 février 2008

Oki ^^lu C re moi , ben enfaite j'ai reussi tout seul ca marche. . .
je plaisante merci a vous deux, car c bon ca marche,(ca fonctionne :) )

en faite j'ai donc tester tout le bordel avec une dll simplifier (celle de yve) et donc ca fonctionner de la je suis parti donc a regarder l'unit de ma dll , et la j'ai donc vu que ,aprés mainte et mainte recherche, qu'en faite ct le composant "QDialog" qui faisait iéch,je pense que je l'avais mit pour faire des teste et que je ne l'avais pas enlevé.

cette dll me sert en faite a recuperé les info d'un avi du style taille de l'image, bitrate, taille du fichier, codec etc. . . . . .
je l'avais fait quasi au debut de mon prog donc je ne savais pas trop ce que le Qdialog faisait là. maintenant savoir pourquoi ca plante avec ce composant j'en sais rien.

Bon maintenant il faut que je me lance dans la modif de la fonction principal de la dll
(celle qui me sert a recup les info du fichier)
car j'utilisais une variable local a la fonction, qui est maintenant dans la dll donc je vait me penché sur la question.

Merci encore a vous deux et a plutart. . . surement. :big)
Messages postés
27
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
16 février 2008

oki salut je tenait juste a vous tenir informé . . . .
que c bon ca marche ma dll fonctionne nickel avec retour de param via pointer sur array donc voila et. . . . et. . . . et re merci et a+
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Exuser moi, mais pour ma part g un big prob de dll (volation d'adresse ... 00000000) et pas moyen de résoudre le prob!
g déja try tt ce ki était plus haut ! :(

mon projet se trouve sur http://membres.lycos.fr/alexis2015/Delphi7/ECRV_Pack.exe

ca fait un mois ke je suis calé sur ca !!! :@
Messages postés
27
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
16 février 2008

dés alexis2015 de repondre si tard mais je suis entrer de vacance la semaine dernière, je ne pense pas t'etre d'un grand secours vu que je debute avec les dlls, mais je voulais quand essayer ..... le truc c que j'ecrit donc ce poste pour signalé que le lien est mort
http://membres.lycos.fr/alexis2015/Delphi7/ECRV_Pack.exe

j'espere simplement que ta reussi, sinon bon courage.......
(je sais ce que c de galéré avec ces ligne de code :( ,
mais j'adore ça :-p ).
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

merci !pour le courage
le lien à été cretainement renommé !
à cause des MAJ donc ...
mais g réessayé d'un faire une otre et ca marche sans le shareMem ! mais g une procedure de ma dll qui ne fct pas tt à fait ( c peut être à cause de l'utilisation de la base des registres lièer à cette procédure)

Alexis
@+