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 :

PChar en retour de DLL


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut PChar en retour de DLL
    bonjour,
    J'ai une DLL qui me donne quelque soucis.
    J'apelle une fonction qui le retourne unPChar. De temps en temps, les 2 ou 3 derniers caractères de la valeur de retour est remplcé par un caractère à prioris au hasard.

    Voici comment la Fonction est defini
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    function BrowseTractImage( directory : PChar;
                               ARasterExtensions : Pchar;
                               AVectorExtensions : Pchar;
                               AList : Pchar;
                               ABarBackground : pointer;
                               AXmlName: Pchar;
                               ADllName: PChar;
                               IvBinaryDictionary: Pointer
                             ) : PChar ; stdcall; export;
    var
      ABarBackgroundBitmap: ^TBitmap;
      TempList: TStringList;
      Sdirectory : String;
      SAName : String;
      SARasterExtensions : String ;
      SAVectorExtensions : String ;
      SAList : String;
      SAXmlName: String;
      SADllName: String;
      PIvBinaryDictionary : ^TIvBinaryDictionary;
      AIvBinaryDictionary: TIvBinaryDictionary;
    begin
     
      Sdirectory             := directory;
      SAName                 := ''       ;
      SARasterExtensions     := ARasterExtensions;
      SAVectorExtensions     := AVectorExtensions;
      SAList                 := AList    ;
      SAXmlName              := AXmlName ;
      SADllName              := ADllName ;
      PIvBinaryDictionary := IvBinaryDictionary;
      AIvBinaryDictionary := PIvBinaryDictionary^;
     
      CoInitialize(nil);
      ABarBackgroundBitmap := ABarBackground;
      TempList := TStringList.create;
      try
        BrowseForImage(nil, directory , SAName, SARasterExtensions, sAVectorExtensions, TempList, ABarBackgroundBitmap^,
          SAXmlName, SADllName, AIvBinaryDictionary);
      GetMem(result, length(sAName) + 5);
      Result:= PAnsiChar(sAName)
     
      finally
       TempList.Free;
      end;
      CoUninitialize;
     
    end;
    La définition dans le programme de test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      TBrowseTractImage = function (
        directory : Pchar;
        ARasterExtensions : Pchar;
        AVectorExtensions : Pchar;
        AList : Pchar;
        ABarBackground : pointer;
        IniName: Pchar;
        DllName: Pchar;
        IvBinaryDictionary: Pointer) :  Pchar ; stdcall; // ImageBrowser.dll;
    L'apelle de la fonction
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    var
      ParametersBrowser : Pchar;
      ABkgd: TBitmap;
      CloseThemes: TCloseThemes;
      BrowseTractImage: TBrowseTractImage;
      SName: String;
    begin
     // name := GetMemory(4096);
     // ParametersBrowser := GetMemory(4096);
      if DllHandle = 0 then
        DllHandle  := LoadLibrary(PAnsiChar('ImageBrowser.dll'));   // LoadLibrary in uses Windows
      try
        if DllHandle <> 0 then begin
          @CloseThemes:= GetProcAddress(DllHandle, 'CloseThemes');
          @BrowseTractImage := GetProcAddress(DllHandle, 'BrowseTractImage');
     
             ABkgd := TBitmap.Create;
            try
     
               ParametersBrowser := '';
              ABkgd.Assign(img1.Picture.Bitmap);
     
              SName := BrowseTractImage(
                '',
                '*.gif;*.bmp;*.jpg;*.jpeg;*.tif;*.Png;*.tga',
                '*.wmf;*.emf;*.eps',
                ParametersBrowser,
                @ABkgd,
                'Essai Ini.xml',
                'TractConfig.Dll',
                @IvBinaryDictionary1
              );
     
              Image1.Visible := False;
              if SName <> '' then  begin
                Label1.Caption := string(Sname);
                Image1.Picture.LoadFromFile(Label1.Caption);
                 Image1.Visible := True;
              end;
              ;
            finally
              ABkgd.Free;
            end;
     
          CloseThemes;
        end;
     
      finally
      end;
    J'ai fait toutes sorte d'essai suivant mes idées et celle que j'ai pus trouver sur internet, mais la, je séche.

    Merci

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Autant que je me souvienne (j'ai plus fait de DLL depuis longtemps), il faudrait retourner la chaine de caractère dans un buffer dont l'adresse est passée en paramètre d'entrée (type Pchar) et renvoyer simplemment dans l'argument de la fonction un simple code retour (type entier, booléen, char,...) ou rien.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Tu fais une grosse bêtise avec ton pointeur dans BrowseTractImage()...
    Fais du trace avec ce bout de code et regarde bien
    l'adresse de MyResult...
    Ici, je travail avec MyResult défini comme un pointeur...
    c'est plus facile de voir le probleme...
    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
     
    procedure TForm1.Button9Click(Sender: TObject);
    var
        sAName:string;
        MyResult:pointer;
    begin
        MyResult:=NIL;
        sAName:='allo';
        GetMem(MyResult, length(sAName) + 5); //adresse de MyResult: $FC5F28
        MyResult:= PAnsiChar(sAName); // --> pas bon! adresse de MyResult change!
        sAName:='';
        FreeMem(MyResult); //Avec GetMem...Ca prend toujours un Freemem!
                                 //Mais là ca plante car MyResult ne pointe plus vers
                                 //le même endroit!
    end;
    tu dois utiliser ton pointer avec strcopy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button9Click(Sender: TObject);
    var
        sAName:string;
        MyResult:pointer;
    begin
        MyResult:=NIL;
        sAName:='allo';
        GetMem(MyResult, length(sAName) + 5); //adresse de MyResult: $FC5F28
        Strcopy(MyResult,PAnsiChar(sAName)); //adresse de MyResult est toujours: $FC5F28 donc ok
        sAName:='';
        FreeMem(MyResult); //Avec GetMem...Ca prend toujours un Freemem!
    end;
    Je crois que c'est bien là le problème....

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Dans la version initiale, la valeur était retournée dans un PChar dans les paramètres d'entrés, et l'argument de retour était un booléen. Je ne suis arrivé à la valeur actuelle qu'après énormément d'essais et de recherche. Mes tentatives ont fait varier la forme de l'appelle, mais qui m'ont toujours laissé avec mon erreur.



    Je n'ai pas lu la réponse de Eric Boisvert avant d'envoyer se message. J'était ocuppé à passer mon texte au correcteur orthographique. Je répondait à Graffito.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Je viens de lire le message d'Eric Boisvert. Je vais essayer dès lundi matin.
    Merci

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Au cas où, il faut ajouter un #0 à la fin de saName.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Cela aussi a été essayer.
    A vrai dire, je me suis tellement embêté avec ce problème que j'ai eu un moment l'envie d'aller jeter le pc dans l'Oise.
    Ceci dit, la sugestion d'Eric Boisvert (utiliser StrPCopy) peut, éventuellement, résoudre mon problème. Je verrais bien Luni.

    Merci pour l'aide.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Je viens de tester StrPCopy. Cela fonctionne.

    Merci infiniment pour l'aide. On ne dira jamais assé comment des détails de ce type peuvent vous pourrir l'existence.

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

Discussions similaires

  1. Problème de retour de dll sous l’API32
    Par Athur dans le forum Threads & Processus
    Réponses: 14
    Dernier message: 08/03/2011, 17h52
  2. Tableau de byte en retour de DLL
    Par ledaziarn dans le forum C++/CLI
    Réponses: 2
    Dernier message: 20/02/2008, 18h06
  3. DLL : récupérer des string/PChar...
    Par the_magik_mushroom dans le forum Langage
    Réponses: 8
    Dernier message: 10/11/2005, 10h58
  4. Paramètre Pchar dans une DLL
    Par Writer dans le forum Langage
    Réponses: 4
    Dernier message: 25/08/2005, 01h33

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