SOSOrdi.net
Identification
Pas encore inscrit(e) ? Cliquez-ici
Bandeaux anti-publicités informatifs dans une question donnée sur SOSOrdi.net pour désactiver les bloqueurs : qu'en pensez-vous ?
  • SOSMania : c'est comprehensible pour une association, bonne idée !
      33%
  • SOSPub(s) : peut-être un peu trop gros ou intrusif (j'en rêve la nuit !)
      17%
  • néoSOS : je ne les vois pas, j'ai désactivé mon bloqueur !
      0%
  • Ne sait pas / pas d'opinion
      50%
Voir les derniers sondages

Conversion pour fichier

Bonjour,

==== Matériel ====
BORLAND Delphi 3 Standard
BORLAND C++Builder 5 Standard


==== But ====
Je veux créer une DLL avec C++Builder et qui soit pilotable avec Delphi. Cette DLL doit faire accéder Delphi à l'intégralité d'un fichier BINAIRE dans le but d'en extraire des informations. Le problème est exposé plus clairement dans la rubrique Delphi, question "Dûr problème ave...".


==== Problème ====
Si le nom fichier est prédéfini (càd constant) dans les codes suivants, la DLL est exquise.
Le passage en paramètre du nom du fichier pose problème.


==== Un truc ====
Il me semble que le rapport des chaînes longues est le suivant
DELPHI: var s : string ;
C++: char s[] = "Voici une chaîne";


==== Caractéristique de la DLL ====
o "Fic" est un fichier universel et utilisable par les autres fonctions
o "IO_OpenFileAsBinary" initialise ce fichier: ouverture en mode binaire
o Le reste de la DLL est lecture, taille du fichier, end of file...
o Expert DLL, C++ en multi-thread, sans VCL, pas de style VC++


//
//
// DU COTé DU C++ //
//
//

#include <fstream.h>
#pragma hrdstop

extern "C" __declspec(dllexport) bool IO_OpenFileAsBinary(string fn);

ifstream Fic; //Ce type ne doit pas changer

bool IO_OpenFileAsBinary(string fn)
{
Fic.open(fn.c_str(), ios::binary);
if (!Fic) { return false ; } else { return true; }
}

//
//
// DU COTé DE DELPHI //
//
//

var Fichier : textfile; //!! Type de fichier quelconque !!
begin
AssignFile(Fichier,'FichierDestination.exe'); //préparation sortie
if not _IO_OpenFileAsBinary('FichierSource.exe') then //init C++
Exit; //quitte si mauvais fichier
try
Rewrite(Fichier); //érase de FicDest
_IO_FileReset; //Pos=0
repeat //t'écris...
Write(Fichier, _IO_FileRead); //Lecture C++ et écriture Delphi
until _IO_EOF; //...jusqu'à la fin du fichier C++
finally
CloseFile(Fic); //ferme fichier Delphi
_IO_FileClose; //ferme fichier C++
end;
end;


==== Remarque ====
Même si en C++, la fonction "IO_OpenFileAsBinary" porte bien son nom, son exportation fait qu'elle s'appelle en réalité "_IO_OpenFileAsBinary".


==== BUGGGGG ====
La fonction IO_OpenFileAsBinary renvoie toujours FALSE, ce qui fait que rien ne marche.
La paramètre fn (pour FileName) ne passe pas. Conversion nécessaire.
Il faut passer le fichier 'c:\\dossier\\xx.exe' dans un «const char * s»


Comment faire cette conversion ? Et que veut dire «const char *».
posté le 1 Oct 2003 dans la catégorie C/C++/C# par grandvizir

12 Réponses

je n'y connais plus rien C et turbo pascal d'origine !
mais char est un caractère et non une chaine (string)
répondu le 1 Oct 2003 par xlasserre
je n'y connais plus rien C et turbo pascal d'origine !
mais char est un caractère et non une chaine (string)
répondu le 1 Oct 2003 par xlasserre
"char" est certes un caractère (on est d'accord) mais un tableau de "char" à la limite non définie est une chaîne. D'où une déclaration de chaînes comme:
char s[]="Voici une chaîne flottante";
char s[11]="Chaîne fixe";

C'est le manuel C++Builder qui le dit.
répondu le 2 Oct 2003 par grandvizir
et pourquoi deux end dans ton delphi ?
répondu le 2 Oct 2003 par xlasserre
Il y a 2 "end":

procedure [...];
begin (* 1 *)
try (* 2 *)
[...]
finally
end; (* 2 *)
end; (* 1 *)

En fait, j'aligne les codes lors du questionnage, et SosOrdi les enlève, d'où une moins bonne lisibilité.
répondu le 4 Oct 2003 par grandvizir
Aidez SOSOrdi.net !
J'ai une fois effectué un test et l'application C++ avait bien reçu le nom du fichier. Ce serait donc la fonction OPEN qui foire.

Je vais préparer tout ça prochainement.
répondu le 6 Oct 2003 par grandvizir
laisse-nous connaitre la fin o)p
répondu le 6 Oct 2003 par xlasserre
En fait, je suis désolé. Cette petite escapade dans le bouquin de C++Builder a montré que toutes les fonctions ci-dessus peuvent être gérées avec la classe TFileStream de la VCL.

C'est très justement que je pensais. Delphi possédant aussi cette classe (car Delphi et C++Builder sont intimement liés malgré leur différence), j'ai fait une petite adaptation et je n'ai plus de problèmes...

Merci encore. Cordialement.
répondu le 11 Oct 2003 par grandvizir
bonne route
répondu le 11 Oct 2003 par xlasserre
Il serait bien de classer cette question dans les résolues. xlasserre....
répondu le 10 Nov 2003 par grandvizir
 
Solution
si grandvizir l'a dit :-o))
répondu le 11 Nov 2003 par xlasserre
Eh oui!
répondu le 12 Nov 2003 par grandvizir
Retour en haut
...