IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

[API] Fonctions FormatMessage et LocalFree


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut [API] Fonctions FormatMessage et LocalFree
    Bonjour à tous.

    Etant toujours resté assez hermétique à la gestion des pointeurs, je voudrais savoir si ma façon de libérer le buffer MsgBuf est correcte.

    Voici mon code:
    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
     
    procedure TFormMain.ActionExecute(Sender: TObject);
    var
      lRet: HINST;
      MsgBuf: PAnsiChar;
    begin
      // le Hint de l'action contient le nom de l'exe
      lRet := LaunchApp(TAction(Sender).Hint);
      if lRet <= 32 then // Erreur
      begin
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
                      nil, GetLastError(), 0, @MsgBuf, 0, nil);
        MessageDlg('Echec lors du lancement de l''application !' + #13#10 + #13#10 +
                   'Application: ' + TAction(Sender).Hint + '.exe' + #13#10 +
                   MsgBuf,
                   mtError, [mbOK], 0);
        LocalFree(DWORD(MsgBuf^));  // <- là ??!!
      end;
    end;
    La fonction LauchApp est un simple ShellExecute dont je récupère le résultat dans lRet.

    La fonction FormatMessage allouant automatiquement la place nécessaire au buffer (LocalAlloc), j'utilise donc la fonction LocalFree pour la libération. Cette syntaxe ne bronche ni à la compilation ni à l'exécution, mais je garde un doute.

    Bref c'est cool ou pas cool ?
    Merci @+ Claudius

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Par défaut
    je ne réponds pas à ton problème mais moi je ferais plutot 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
    16
    procedure TFormMain.ActionExecute(Sender: TObject);
    var
      lRet: HINST;
      MsgBuf: string;
    begin
      // le Hint de l'action contient le nom de l'exe
      lRet := LaunchApp(TAction(Sender).Hint);
      if lRet <= 32 then // Erreur
      begin
        MsgBuf := SysErrorMessage( GetLastError());
        MessageDlg('Echec lors du lancement de l''application !' + #13#10 + #13#10 +
                   'Application: ' + TAction(Sender).Hint + '.exe' + #13#10 +
                   MsgBuf,
                   mtError, [mbOK], 0);
      end;
    end;

  3. #3
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut,

    Ouais effectivement c'est une façon beaucoup plus simple d'aborder le problème . C'est ta méthode que je vais utiliser.
    Merci

    Je laisse le post en non résolu en espérant un autre intervenant, car je reste d'une nature curieuse

    Merci encore @+

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Claudius40
    car je reste d'une nature curieuse
    Dans ce cas voir MSDN :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/localfree.asp

    La VCL D2005 utilise une seule fois cette API, dans une procédure de gestion de thread.
    Mais certaines API nécessitent son appel:
    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
     
    unit AclAPI;
     
    {$WEAKPACKAGEUNIT}
     
    //  Contents:    public header file for acl and trusted server access control
    //               APIs
     
    interface
     
    (*HPPEMIT '#include <aclApi.h>' *)
    ...
     
    function GetExplicitEntriesFromAcl(var pacl: ACL; var pcCountOfExplicitEntries: ULONG;
             pListOfExplicitEntries: PEXPLICIT_ACCESS_): DWORD; stdcall; {use localfree to release pListOfExplicitEntries}

  5. #5
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    @Mister Dardenne,

    Merci pour le lien. Pour le curieux que je suis je n'ai pas le réflexe msdn !

    Je vais potassé tout ça. Je tag résolu !

    Merci et @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Youtube API : fonctions non définies
    Par crazymonkey dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/07/2011, 00h17
  2. perl et win32::api (fonctions windows)
    Par jonhdooe dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 22/02/2011, 12h12
  3. [API Windows] Fonction Rectangle
    Par Zazeglu dans le forum Windows
    Réponses: 4
    Dernier message: 29/01/2004, 21h44
  4. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo