Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème avec la procedure Exit [ Divers / Débutant(e) ] (christophedlr)

vendredi 15 août 2008 à 10:41:04 | Problème avec la procedure Exit

christophedlr

Membre Club
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));

Merci d'avance.

vendredi 15 août 2008 à 16:18:44 | Re : Problème avec la procedure Exit

f0xi

Membre Club Administrateur CodeS-SourceS

tes numeros de version sont sous ce format  ?

Major.minor.release.build ?

alors ne fait pas comme cela.

stocke la version en Int dans le ini (readinteger, writeinteger) comme ceci :

[version]
maj = 1
min = 2
rel = 0
bui = 3

deja se sera plus simple que de traiter avec un string.

ensuite crée un type TFileVersion :

Type
  TFileVersion = record
    Major, Minor, Release, Build : word;
  end;


cela permettra de stocker la version

creation des version :

function CreateFileVersion(const Major, Minor, Release, Build: word): TFileVersion;
begin
  result.Major := Major;
  result.Minor := Minor;
  result.Release := Release;
  result.Build := Build;
end;


lecture de la version :

function ReadVersion: TFileVersion;
var F: string;
begin
  F := ChangeFileExt(ParamStr(0), 'ini');
  if not FileExits(F) then
    assert('File not found '+F);

  with TIniFile.Create(F) do
  try
    result.Major := ReadInteger('version', 'maj');
    result.Minor := ReadInteger('version', 'min');
    result.Release:= ReadInteger('version', 'rel');
    result.Build := ReadInteger('version', 'bui');
  finally
    Free;
  end;
end;


enregistrement de la version :

procedure WriteFileVersion(const FileVersion: TFileVersion);
var F: string;
begin
  F := ChangeFileExt(ParamStr(0), 'ini');

  with TIniFile.Create(F) do
  try
    WriteInteger('version', 'maj', FileVersion.Major);
    WriteInteger('version', 'min', FileVersion.Minor);
    WriteInteger('version', 'rel', FileVersion.Release);
    WriteInteger('version', 'bui', FileVersion.Build);
  finally
    Free;
  end;
end;


affichage de la version :

function FileVersionToStr(const FV: TFileVersion): PChar;
begin
  result := format('%d.%d.%d.%d',[FV.Major, FV.Minor, FV.Release, FV.Build]);
end;



voila, cela te permettra de ne pas manipuler de chaines et ainsi d'eviter des erreurs.




vendredi 15 août 2008 à 16:30:36 | Re : Problème avec la procedure Exit

christophedlr

Membre Club
Je veux bien, mais ça me dit pas pourquoi j'ai une erreur et qui plus est n'arrive que quand update.exe est lancé depuis delphi et non directement.

vendredi 15 août 2008 à 16:36:50 | Re : Problème avec la procedure Exit

f0xi

Membre Club Administrateur CodeS-SourceS


HA! voila le truc, l'erreur n'est la que quand on lance a partir de delphi.

alors comment lance tu ta DLL dans ton wrapper ?

avec LoadLibrary ou en statique :

interface

function GetVersion(...); stdcall;

implementation

const
  DLL = 'MaDLL.dll';

function GetVersion; external DLL name 'GetVersion';

end;


?




vendredi 15 août 2008 à 16:57:37 | Re : Problème avec la procedure Exit

f0xi

Membre Club Administrateur CodeS-SourceS


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;

function GetVersion(const version: PChar; const Len: integer): LongWord; stdcall;
var S: string;
    Mj, Mn, Rl, Bd: byte;
begin
  SetString(S, Version, Len);
  Mj := StrToIntDef(GetStrPart(S, '.', 1), 0);
  Mn := StrToIntDef(GetStrPart(S, '.', 2), 0);
  Rl := StrToIntDef(GetStrPart(S, '.', 3), 0);
  Bd := StrToIntDef(GetStrPart(S, '.', 4), 0);

  result := (Mn shl 24) or (Mj shl 16) or (Bd shl 8) or Rl;
end;


exports
  GetVersion;

begin
end.

FICHIER MaDLL.PAS (wrapper)

unit MaDLL;

interface

// Wrapper

function GetVersion(const version: PChar; const Len: integer): LongWord; stdcall;

implementation

const
  DLL = 'MaDLL.dll';

function GetVersion; external DLL name 'GetVersion';

end.



FICHIER MAIN.PAS (projet TESTDLL.DPR)

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

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.




vendredi 15 août 2008 à 17:58:32 | Re : Problème avec la procedure Exit

christophedlr

Membre Club
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 ;)

vendredi 15 août 2008 à 20:41:51 | Re : Problème avec la procedure Exit

florenth

Membre Club
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 ?

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]

samedi 16 août 2008 à 05:30:56 | Re : Problème avec la procedure Exit

f0xi

Membre Club Administrateur CodeS-SourceS
"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"

Pour nous aussi c'est le J.O. il parrait.






Cette discussion est classé dans : programme, version, jour, temp, exit


Répondre à ce message

Sujets en rapport avec ce message

Mise a jour de delphi [ par norton ] Existe-t'il un patch pour passer delphi de la version anglaise a la version française?si oui ou peut on le trouver ?merci bon coding a tous . Trial Version Delphi 6 ! [ par titi29 ] J'ai réalisé un programme avec la version Trial de Delphi 6 Entreprise. J'ai compilé mon programme avant la fin de ma période de 60 jours.Et les 60 jo pb d'execution du programme [ par drew00 ] je travaille actuellement sur une version d'evaluation de delphi.j'ai essayé d'executer mon programme depuis une machine ou le logiciel n'est pas inst Mise à jour automatique d'une application [ par vincentstryckmans ] Salut, Je souhaite que mon application se mette automatiquement à jour en comparant son numéro de version avec celui de la dernière version enregistr comment séparer une chaine de caractère [ par Rudy3212 ] Best PigVoila comment séparé une chaine de caractère, voila je m'expliqueExemple : je fait un programme qui fait une mise à jour dans un fichier qu'il Mettre a jour son appli [ par cocowz ] Bonjour, Je cherche cherche comment creer une fonction pour mettre a jour mon application par le net.Pourriez vous m'aider a le faire...En fait je veu Fermer un process sans sa DLL [ par christophedlr ] Bonjour,Pour mon programme je voudrais faire un système de mise à jour.Je pensais à faire une DLL, mais on arrive à ma question.Quand on provoque la f Mise a jour DELPHI [ par jmj01 ] Bonjour, J'aimerais quelques renseignements quant aux versions de Delphi. Je suis possesseur de la version 4 professionnelle et j'en suis satisfait. Un programme pour modifier le numéro de version [ par vivelesquads ] Bonjour,J'ai besoin d'écrire un programme avec Delphi 7 qui puisse modifier le numéro de version d'un exécutable(créé par Delphi mais je ne pense pas MOTUS liste de mot limité ? [ par durandus ] Bonjour, Je suis entrain d'essayé de faire un MOTUS en C++ et lorsque je lance mon programme il plante,je pense que ca vient du faite que la liste de


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.