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 :

Pchar, Pansichar et autres


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut Pchar, Pansichar et autres
    Bonjours a tous .

    Je pensais que depuis Delphi Xe, un Pchar et un Pansichar fonctionnaient à l'identique. Ce dont je doute suite au problème que j'ai en ce moment.Je vais essayer de vous l'exposer, en espérant que vous aurez des idées.

    J'ai une application développée sous D7 qui tourne aussi bien sous XP que sous W7. Cette application communique avec LabView (ver 2009/2010) pour effectuer des taches demandait par LabView. Elle fonctionnait parfaitement jusqu’à présent avec la structure ci-dessous.

    Pour les connaisseurs du "C" les fonctions déclarées dans LabView ont le prototype suivant:
    int32_t chargeFichier(CStr CheminFichier)
    Convention d'appel : stdcall (WinApi).

    LabView communique avec une DLL "chapeau" qui a un prototype suivant :
    function chargeFichier(CheminFichier : Pchar): integer:stdcall

    Ces deux entités ( LabView et la DLL "chapeau") communiquent entre elles et la DLL "chapeau" communique avec toutes les autres DLLs de l'application (écrites en Delphi).
    Le passage des chaines de caractères entre LabView et la DLL "chapeau" et toutes les autres DLLs sont passées sous la forme de Pchar

    et tout se passait bien.

    ---------------------------

    Actuellement je suis sous W7 , mais je suis passé de D7 à XE2. J'ai fait évoluer la DLL "chapeau" pour ajouter des fonctions et là , les soucis commencent !

    1° Aucune différence de codage du coté de LabView. Tout fonctionne bien tant que j'utilise une version compilé sous D7.

    2° le problème se pose lors du passage de chaine de caractères entre LabView et la DLL "chapeau" (peut être aussi avec les autres).
    - si dans ma fonction (delphi) le paramètre de ma chaine est déclaré sous la forme d'un Pchar:
    function chargeFichier(CheminFichier : Pchar): integer:stdcall <= la chaine que je récupère dans cheminfichier n'est composée que d'un seul caractère.

    - si dans ma fonction (delphi) le paramètre de ma chaine est déclaré sous la forme d'un Pansichar:
    function chargeFichier(CheminFichier : Pansichar): integer:stdcall <= la chaine que je récupère dans cheminfichier est correcte !.

    Ceci semble dire que le comportement diffère entre un Pchar et un Pansichar que je croyais fonctionner à l'identique.

    3° Après avoir récupérer la chaine envoyée depuis LabView à la DLL chapeau, j'ai parfois besoin de l'envoyer aux d'autres DLLs (DLL que je peux pas modifier).
    Et pour faire cela je convertis les chaines reçues en Pansichar vers Pchar pour être compatible avec les autres DLLs. Mais elles ne semblent pas recevoir les bonnes chaines donc je pointe plus ou il faut !!

    voici la routine de conversion que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Pansi2Pchar(st : Pansichar) : Pchar;
    var AnsiSt : AnsiString;
    begin
           Result:=nil;
           if st<> nil then
           begin 
               AnsiSt := AnsiString(st);
               Result  := Pchar(string(AnsiSt));
           end;
    end;
    Je pense me mélanger les pinceaux , avec les Pchar et autres ....

    Si quelqu'un peut me donner un coup de main pour me donner des idées , des pistes ...

    merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    PChar est maintenant un PWideChar. Si les DLL n'ont pas évolué, il est juste de passer par des AnsiString, PAnsiChar.

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut
    Salut,

    Mon problème venait de ma procédure de conversion PansiChar => Pchar.

    Donc les paramètres de LabView récupérer par la DLL "chapeau" étaient correct, mais quand ils étaient renvoyés aux autres DLL, il étaient plus conformes.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Il ne devrait pas y avoir de conversion du tout, la DLL source et la DLL de destination n'ont pas changé.
    Ton code n'est d'ailleurs que du transtypage, tu forces l'interprétation de la donnée dans un type précis mais il n'y a aucune conversion.

    Le passage de string à AnsiString est automatique en Delphi, il suffit de déclarer une variable de chaque type. Pour faire compliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function AnsiToString(aText :AnsiString) :string;
    begin
      Result := aText;
    end;

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

Discussions similaires

  1. Problème avec les PAnsiChar, PChar, PWideChar.
    Par djiga4me dans le forum Langage
    Réponses: 15
    Dernier message: 22/07/2010, 14h03
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  4. Réponses: 2
    Dernier message: 21/05/2002, 10h25
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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