cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 2023
-
15 août 2008 à 10:41
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
16 août 2008 à 05:30
Bonjour,
Dans mon programme, j'ai fait une DLL contenant des fonctions que j'utilise dans le programme ainsi que dans l'utilitaire de mise à jour.
J'ai pour le moment qu'une seule fonction me servant à renvoyer un integer d'après une chaine.
L'utilitaire de mise à jour se sert de cette version afin de comparer le numéro de version de update.ini et celui du programme (contenu dans un fichier INI).
Si la version de update.ini est inférieur ou égale à celle du programme, il va afficher un message indiquant qu'aucune mise à jour est disponible et quitter par un simple Exit, afin d'éviter qu'il continu le processus de mise à jour.
Le hic se trouve ici, quand il passe sur le Exit, Delphi me renvoi l'information suivante :
Echec du projet c:\prog\delphi\FicEditor\update.exe avec le message : 'violation d'accès à 0x00a75d7d : lecture de l'adresse 0xffffffff'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
J'ai tenté de commenter l'utilisation de la fonction de ma DLL et ça ne le fais pas.
Voici le code de la DLL :
function GetVersionInteger(Version: PChar): Integer;
var
Temp: String;
begin
Temp := MidStr(Version, 1, 1);
Temp := Temp+MidStr(Version, 3, 1);
Temp := Temp+MidStr(Version, 5, 1);
Temp := Temp+MidStr(Version, 7, 1);
Result := StrToInt(Temp);
end;
Je suppose que le problème viens donc de là.
Sinon, voila comment j'appel la fonction depuis l'EXe :
function GetVersionInteger(Version: PChar): Integer; stdcall; external 'divers';
Pour la déclaration, et pour l'utilisation :
IntVersion := GetVersionInteger(PChar(Version));
IntVersionIni := GetVersionInteger(PChar(VersionIni));
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 15 août 2008 à 16:57
ah désolé j'avais pas vus que tu nous le précisé dans ton premier post.
mmm.
en fait, un conseil. quand tu fait une DLL, fait un wrapper qui vas avec, n'appel pas directement les fonctions dans l'unité du programme, ce sera plus propre.
FICHIER MaDLL.DPR :
library MaDLL;
uses
SysUtils,
StrUtils,
Classes;
{$R *.res}
function GetStrPart(const Str, Delimiter: String; const WordIndex: cardinal = 1): String;
var I,P1,P2 : integer;
begin
Result := '';
if (posex(Delimiter,Str[1]) = 1) and (WordIndex <= 1) then exit;
P1 := 1;
for I := 1 to WordIndex-1 do begin
P1 := posex(Delimiter, Str, P1);
if P1 = 0 then exit
else P1 := P1 + length(Delimiter);
end;
P2 := posex(Delimiter, Str, P1);
if P2 = 0 then P2 := length(Str) + 1;
Result := copy(Str, P1, P2 - P1);
end;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
Uses MaDLL;
procedure TForm2.FormCreate(Sender: TObject);
var V : string;
L : integer;
begin
V := '1.12.3.4';
L := Length(V);
caption := format('%.8x',[GetVersion(PChar(V), L)]);
end;
end.
hop.
<hr size="2" width="100%" />
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20234 15 août 2008 à 17:58
Si j'appelle l'unité, la DLL sert à rien si ?
Sinon, en fait j'ai demandé à mon frangin, en fait il semblerait que contrairement à ce que disent phidels et delphipage, par défaut c'est pas stdcall mais register, donc du coup ça foiré.
Après ajout du stdcall dans la DLL, plus de problème ;)
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 15 août 2008 à 20:41
Je confirme: par défaut, la convention est register.
Et j'approuve f0xi: fais une unité dite "wrapper" qui contient toutes les déclarations des fonctions de ta dll. D'une part, ça t'évites de le faire dans chaque programme et en plus tu t'évites des erreurs.
@foxi: dis moi, t'a une de ces pèche en ce moment !!! T'es en vacances ou tu te dopes ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 août 2008 à 05:30
"en fait il semblerait que contrairement à ce que disent phidels et delphipage, par défaut c'est pas stdcall mais register"
Tu as surrement du mal comprendre ce qu'ils ont dis. StdCall est la convention d'appel par defaut des librairies Win32. Mais effectivement Delphi est par defaut en Register (a ne pas utiliser quand on fait un DLL pouvant etre utilisée avec C, C++ ou VB).
En C et C++ par defaut c'est CDECL, en VB c'est surrement STDCALL.
" t'a une de ces pèche en ce moment !!! T'es en vacances ou tu te dopes"