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

 Delphi Discussion :

Problème de format de chaine de caractères ?


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Problème de format de chaine de caractères ?
    Bonjour,

    Je suis en train de développer un plugin pour OllyDbg et je rencontre un problème avec la gestion des chaines de caractères.

    Voici ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {$A1}
     
    procedure Log(Ligne:string);
    begin
         Addtolist(0, 1, 'DEBUG : %s', Ligne);
    end;
    Le résultat que j'ai dans ma fenêtre de log est le suivant :
    DEBUG : g
    DEBUG : g
    DEBUG : g
    DEBUG : g
    DEBUG : 0
    DEBUG : 0
    Je n'ai que le premier caractère de ma variable...

    Je ne sais pas pourquoi et comment régler le problème ?

    Merci,
    ZiP

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Il nous manque le code autour !
    Appel de Log
    Code de Addtolist (utilise Format je suppose)

    Pourquoi tu forces l'alignement packed ?

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    J'appelle "Log" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if Debug then
    begin
         Log('gDebugProcessId = ' + IntToStr(gDebugProcessId));
         Log('gDebugHandleProcess = ' + IntToStr(gDebugHandleProcess));
         Log('gDebugModuleBase = ' + IntToStr(gDebugModuleBase));
         Log('gDebugFileName = ' + gDebugFileName);
    end;
    La fonction Addtolist est déclarée comme ceci dans Plugin.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure Addtolist(addr: LongInt; highlight: Integer; format: PAnsiChar); cdecl; varargs;
    Pour répondre à ta dernière question :
    Following compiler settings are required for correct communication between plugin and OllyDbg. For compilers listed above, plugin.h forces or checks some of these rules:
    * Export all callback functions by name, NOT by ordinal;
    * If you use C++ compiler, disable name mangling on all callback functions (declare them as extern "C");
    * Force standard C-style passing of parameters to all API and callback functions (declare them as cdecl);
    * Force BYTE alignment of all structures declared in plugin.h;
    * Set default character type to UNSIGNED.
    J'ai attaché mon fichier Plugin.pas où il y a les différentes déclarations.

    Lorsque j'utilise le code suivant avec des constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    const
         PluginVersion  = '0.1';
         PluginName     = 'PluginZiP';
         PluginAuthor   = 'ZiP';
     
    // On ajoute des informations dans la fenêtre "Log" d'OllyDbg
    Addtolist(0, 0, ' ');
    Addtolist(0, 0, PluginName);
    Addtolist(0, -1, 'Version : ' + PluginVersion);
    Addtolist(0, -1, 'Author : ' + PluginAuthor);
    Addtolist(0, 0, ' ');
    Les informations sont affichées correctement dans la fenêtre de Log.

    Merci,
    ZiP
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Tu ne passerais pas 4 paramètre au lieu de 3 ?

    En Ignorant varargs, j'écrirais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Log(const Ligne:string);
    begin
         Addtolist(0, 1, PChar(Format('DEBUG : %s', [Ligne])));
    end;
    Car, comment faire comprendre à Delphi que tu passe une chaine string, type Delphi uniquement, à fonction C acceptant un paramètre variable de paramètre attendant des types C !

    Essaye ça, ne fait que forcer le type en char*, car on a l'impression que dans ton cas, il ne gère qu'un char !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Log(const Ligne:string);
    begin
         Addtolist(0, 1, 'DEBUG : %s', PChar(Ligne));
    end;
    Voir si avec un "Args: Array of const" à la façon de Format, il n'existe pas des astuces du compilateur ?

  5. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Je viens d'essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure Log(Ligne:string);
    begin
         Addtolist(0, 1, PAnsiChar(Format('DEBUG : %s', [Ligne])));
    end;
    Il m'affiche :
    D
    D
    D
    D
    Je ne trouve pas de solution

    Merci pour votre aide,
    ZiP

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Question ?
    Version de Delphi ? 2009 ou plus ?

    essaye comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Log(Ligne:string);
    var
      ParamStr: AnsiString;
    begin
      ParamStr := Ligne;    
      Addtolist(0, 1, 'DEBUG : %s', PAnsiChar(ParamStr));
    end;

  7. #7
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour ShaiLeTroll,

    J'utilise Delphi XE et votre code fonctionne !

    Un grand merci !

    J'ai donc modifié ma fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure Log(Ligne:AnsiString);
    begin
         Addtolist(0, 1, 'DEBUG : %s', Ligne);
    end;
    Merci,
    ZiP

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut

    Ah, j'ai bien senti le coup venir, de caractère #0 unicode indiquant une fin de chaine Ansi !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/05/2006, 15h23
  2. Réponses: 2
    Dernier message: 23/03/2006, 12h39
  3. Réponses: 11
    Dernier message: 22/03/2006, 21h57
  4. Réponses: 3
    Dernier message: 01/02/2006, 18h26
  5. Réponses: 4
    Dernier message: 20/08/2004, 10h59

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