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

Résolu
fcr_loch Messages postés 27 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 16 février 2008 - 24 juil. 2004 à 03:34
alexis2015 Messages postés 73 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 24 juillet 2005 - 31 août 2004 à 23:47
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

yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
24 juil. 2004 à 18:15
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
3
cs_zmc Messages postés 147 Date d'inscription vendredi 26 avril 2002 Statut Membre Dernière intervention 26 avril 2008 1
24 juil. 2004 à 14:43
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.
0
fcr_loch Messages postés 27 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 16 février 2008
24 juil. 2004 à 17:24
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. . .
0
cs_zmc Messages postés 147 Date d'inscription vendredi 26 avril 2002 Statut Membre Dernière intervention 26 avril 2008 1
24 juil. 2004 à 17:33
Toutes tes fonctions plantent ou c'est "simplement" celle-ci ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
24 juil. 2004 à 17:37
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
0
fcr_loch Messages postés 27 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 16 février 2008
24 juil. 2004 à 20:49
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)
0
fcr_loch Messages postés 27 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 16 février 2008
25 juil. 2004 à 14:23
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+
0
alexis2015 Messages postés 73 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 24 juillet 2005
15 août 2004 à 15:45
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 !!! :@
0
fcr_loch Messages postés 27 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 16 février 2008
31 août 2004 à 22:37
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 ).
0
alexis2015 Messages postés 73 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 24 juillet 2005
31 août 2004 à 23:47
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
@+
0
Rejoignez-nous