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

Langage Delphi Discussion :

DLL : récupérer des string/PChar...


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut DLL : récupérer des string/PChar...
    bonjour,

    je n'arrive pas a récupérer des strings depuis une de mes dll.
    j'ai tout essayé, PChar, ShortString... et je bloque

    voici le code de ma dll:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    library Project1;
    uses
      SysUtils,
      Classes,
      Windows;
    {$R *.RES}
     
    function getnameuser: string; StdCall;
    const
      cnMaxUserNameLen = 254;
    var
      sUserName: string;
      dwUserNameLen: DWORD;
    begin
      dwUserNameLen := cnMaxUserNameLen - 1;
      SetLength(sUserName, cnMaxUserNameLen);
      GetUserName(PChar(sUserName), dwUserNameLen);
      SetLength(sUserName, dwUserNameLen);
      Result := sUserName;
    end;
     
    function messtrg: PChar; StdCall;
    var
    str1, str2: string;
    begin
    str1 := ('username :  ' + getnameuser);
    str2 := ('salut! ');
    result := PChar(str1);
    end;
     
    exports
    getnameuser,
    messtrg;
     
    begin
    end.

    et de mon exe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    Type TMonmesstrg = procedure;
    Var
    Hdle : THandle;
    messtrg: TMonmesstrg;
    begin
     
    Hdle:=LoadLibrary(PChar('C:\test.dll')); //Charge la DLL
    @messtrg:=GetProcAddress(Hdle,'messtrg'); //Récupère l'adresse de la procedure
    messtrg; //Appelle la procedure "messtrg"
    FreeLibrary(Hdle); //Libère la DLL
    end;
    j'ai essayé des 15 façons différentes sans succès,
    ce que je voudrai c'est récupérer str1 et str2 en appelant messtrg.

    merci d'avance

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Il n'y a pas une unité spéciale à rajouter par hasard, style ShareMem ou je ne sais plus trop (j'ai pas mon Delphi sous les yeux) : : :
    Bidouilleuse Delphi

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    en utilisant les PChar ont peu justement se passer de sharemem (enfin je crois)

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par the_magik_mushroom
    en utilisant les PChar ont peu justement se passer de sharemem (enfin je crois)
    Oui mais en utilisant que des PChar, dès que tu as un type String déclaré quelque part, il me semble que ça ne marche plus justement (je me trompe TREEEEEEEEEEEEEEES surement, hein, donc je ne m'avance pas trop... )
    Bidouilleuse Delphi

  5. #5
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Citation Envoyé par waskol
    Citation Envoyé par the_magik_mushroom
    en utilisant les PChar ont peu justement se passer de sharemem (enfin je crois)
    Oui mais en utilisant que des PChar, dès que tu as un type String déclaré quelque part, il me semble que ça ne marche plus justement (je me trompe TREEEEEEEEEEEEEEES surement, hein, donc je ne m'avance pas trop... )
    Tu ne te trompes absolument pas! Si l'on veut que nos Dll soient "portables" il faut absolument que toutes les chaînes de caractéres aussi bien échangée au travers de la Dll qu'à l'intérieur de la dll respectent certaines régles comme celles énoncées dans ce tuto
    Cordialement,
    Hauwke

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    merci pour le tuto, mais je suis toujours bloqué :/

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Hauwke
    Tu ne te trompes absolument pas! Si l'on veut que nos Dll soient "portables" il faut absolument que toutes les chaînes de caractéres aussi bien échangée au travers de la Dll qu'à l'intérieur de la dll respectent
    Mais non, seule les types exportés ont de l'importance. Dans mes dlls je fait toujours des fonctions qui exportent des PChars mais en interne j'utilise des String, Class et tout un tas d'autres truc et ça marche presque toujours

    bon ensuite si tu déclares ta fonction TMonmessstrg comme un procédure, ça va pas marcher

    donc pour le 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
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    Type TMonmesstrg = function : PChar;StdCall; //même déclaration que pour messstrg
     
    Var
    Hdle : THandle;
    messtrg: TMonmesstrg;
    ChaineDeResultat : string;
    begin
     
    Hdle:=LoadLibrary(PChar('C:\test.dll')); //Charge la DLL
    @messtrg:=GetProcAddress(Hdle,'messtrg'); 
     
    ChaineDeResultat := StrPas(messtrg); //On récupère la chaine
     
    FreeLibrary(Hdle); //Libère la DLL
    end;
    et maintenant la dll :
    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
     
    function messtrg: PChar; StdCall;
    var
    str1, str2: string;
    Res : PChar;
    begin
    str1 := ('username :  ' + getnameuser);
    str2 := ('salut! ');
     
    //result := PChar(str1); FAUT PAS FAIRE ce genre de trucs, ça peut faire des érreurs avec la gestion de la mémoire donc :
     
    str2 := str2 + #0; //caractère de fin de chaine sous windows
     
    GetMem(Res,Length(str2));
    Move(Pointer(str2)^,Res^,Length(str2));
    Result := Res;
    end;
    Bon, voilà qui devrais marcher nikel

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    ça marche nikel, merci

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Smyley :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //result := PChar(str1); FAUT PAS FAIRE ce genre de trucs, ça peut faire des érreurs avec la gestion de la mémoire donc :
     
    str2 := str2 + #0; //caractère de fin de chaine sous windows
     
    GetMem(Res,Length(str2));
    Move(Pointer(str2)^,Res^,Length(str2));
    Je viens d'apprendre quelque chose là !
    Bidouilleuse Delphi

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/03/2011, 17h13
  2. Réponses: 3
    Dernier message: 11/01/2007, 21h18
  3. Réponses: 6
    Dernier message: 18/10/2006, 16h34
  4. Récupérer des floats à partir d'une string
    Par hamster dans le forum SL & STL
    Réponses: 8
    Dernier message: 09/06/2005, 08h10

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