Bonjour,

J’ai réalisé une application sous Delphi 2005 avec la VCL Win 32 (Programme A). Depuis cette application, je dois récupérer une valeur par un WebService. J’ai donc écrit un autre programme sous Delphi 2005 avec la VCL .NET (Programme B).

Lorsque je lance le programme le Programme B à partir d’un bouton du Programme A, j’obtient une erreur non gérée par l’application. Voici une partie du code du programme A :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
var
  CodeErreur : integer;

begin
  EcrireFichier('C:\ProgAAccount.txt', Trim(eNumCompte.Text));

  CodeErreur := ShellExecute(0, 'OPEN', 'C:\Program Files\ProgrammeB.exe',  
  Nil, Nil, SW_SHOW);
  if CodeErreur <=32
  then ShowMessage(SysErrorMessage(CodeErreur));
  else  ESMS.Text := ' '  + LireAccount;
end;
Voici le code de EcrireFichier :

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
procedure TForm1.EcrireFichier(NomFichier : string; Texte : string);
 
var
  F   : TextFile;
  Res : integer;
 
begin
    AssignFile(F, NomFichier);
    {$I-}
      Rewrite(F);
    {$I+}
    Res := IOResult;
    if Res = 0
    then begin
               Try
                 WriteLn(F, Texte);
               Finally
                 CloseFile(F);
               end;
         end
end;
L’erreur est déclenchée par le lancement du ProgrammeB.exe. En faisant des recherches, je me suis aperçu que l’erreur vient du type de chaîne utilisé. Par le programme A, j’écrit un fichier de type TextFile en VCL (création du fichier .txt sur le disque).

Avec le code suivant dans le programme B, j’obtient l’erreur citée plus haut au niveau de Result := Service.GetMessageLimit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
constructor TWinform2.Create;
 
begin
  inherited Create;
  InitializeComponent;
  Account :=  LireFichier('C:\ ProgAAccount txt');
end;
La procédure du programme B qui appelle le WebService est la suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
procedure TWinform2.BSynchro_Click(sender: System.Object; e: System.EventArgs);

begin
    myHeader := MessengerHeader.Create;
    myHeader.Account := Account;
    Service := accountService.AccountService.AccountService.Create;
    Service.MessengerHeaderValue := myHeader;
    Result := Service.GetMessageLimit;
    NbSMS.Text := IntToStr(Result); //Mets à jour le champs
end;
Si par contre, je renseigne en "dur" les valeurs comme suit, le programme fonctionne bien et j’ai bien une valeur en retour du WebService :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
constructor TWinform2.Create;
 
begin
  inherited Create;
  InitializeComponent;
  Account := 'EX0055896';
end;
En fait, je me pose la question au niveau de la chaîne : comme j’écris un fichier texte en Delphi Win32 sur le disque, puis je lis la valeur de ce fichier par l’autre programme réalisé en Delphi .Net, l’erreur doit venir du type de string. Est-ce que je dois utiliser AnsiString, PChar ou autre pour lire une fichier texte ?

Pour lire le fichier, voici la procédure que j’ai créé depuis le programme B :

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
function TWinform2.LireFichier(ChemFichier : string) : string;
 
var
  FileInfo : System.IO.FileInfo;
  Reader   : System.IO.StreamReader;
 
begin
  Result := '';
  FileInfo := System.IO.FileInfo.Create(ChemFichier);
  Reader := FileInfo.OpenText;
  Console.WriteLine(Reader.ReadToEnd);
  Result := Reader.ReadToEnd;
  Reader.Close;
  Console.Readline;
end;
Le fichier me renvoie bien pourtant la bonne valeur.

Merci pour votre aide !