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:
Je pense me mélanger les pinceaux , avec les Pchar et autres ....
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;
Si quelqu'un peut me donner un coup de main pour me donner des idées , des pistes ...
merci d'avance.
Partager