Discussion: Un Petit Programme
Afficher un message
Vieux 04/05/2004, 23h11   #17 (permalink)
Kikof
Informaticien du dimanche
 
Date d'inscription: mars 2003
Localisation: Autrefois, on appelait cela Europe
Âge: 41
Messages: 7 039
Par défaut

Bon on va essayer de faire approcher ce programme d'un vrai programme

Tout d'abord l'emplacement de ton fichier est défini par #define pc_INI_OEM "c:\\windows\\system\\oeminfo.ini"
Le petit problème c'est que rien n'assure ni que windows soit installé sur C: ni que son répertoire soit windows\ (c'est winNT\ pour win 2000 par exemple). Si un tel cas se produit, le fichier ne pouvant être créé, le programme plantera et émettra un misérable message d'erreur avant de se fermer (il faudrait prévoir ce cas d'ailleurs mais bon pas tout de suite).

Tu vas remplacer la constante par #define pc_INI_OEM "\\system\\oeminfo.ini"
Ensuite dans la fonction void __fastcall TptfOemInfo::pbbEcrireClick(TObject *Sender) tu mets au début :
Code:
#define pc_TAILLE 256
char pcRep[pc_TAILLE];
GetWindowsDirectory(pcRep, pc_TAILLE-1);

TIniFile* pOemIni = new TIniFile(AnsiString(pcRep) + pc_INI_OEM);
Il faut donc substituer la ligne TIniFile* ... par celle ci dessus. GetWindowsDirectory renvoie le répertoire de présence de windows, soit le plus souvent sous XP : c:\windows. Le total AnsiString(pcRep) + pc_INI_OEM redonnera bien c:\windows\system\oeminfo.ini.

Dans le même genre d'idée puisque tu veux un fichier sur le bureau, la première tâche à accomplir est de demander au système où se trouve le répertoire contenant le bureau. Ceci peut être accompli par :
Code:
SHGetSpecialFolderPath(NULL, pcRep, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
On a donc l'un des répertoires où se trouve le bureau, ici c'est "all users" qui est utilisé pour être sûr que ça s'affiche sur le bureau (c:\documents and settings\all users\bureau\). pcRep a été défini précédement. Ce code est à placer après delete pOemIni;.
Dans le fichier oeminfo_p.h, tu ajoutes au début #include <shlobj.h> (c'est là où se trouve la fonction SHGetSpecialFolderPath).
Comme ça serait trop simple, il se trouve que C++ builder est légèrement buggé au sujet de SHGetSpecialFolderPath. Pour que cette fonction se compile, il faut aller dans le menu Projet / Options..., onglet "Répertoires/Conditions". Clique sur le bouton "..." du cadre "Conditionnels". Dans le champs du bas tu mets NO_WIN32_LEAN_AND_MEAN puis tu cliques sur "Ajouter" et tu fermes tous les dialogues en cliquant sur Ok. Bon, je te fais grace des détails sur ce bug.

Dernière étape, créer le fichier oeminfo.txt et écrire le numéro de série dedans. Tout d'abord il faut définir le nom de ce fichier dans oeminfo_p.h parmis les autres constantes en ajoutant #define pc_SERIE_INFO "\\numserie.txt". Le temps est maintenant venu de faire connaissance avec la classe TFileStream qui permet une gestion primitive mais efficace des fichiers. Dans la fonction void __fastcall TptfOemInfo::pbbEcrireClick(TObject *Sender) juste après SHGetSpecialFolderPath, tu ajoutes :
Code:
TFileStream* ptfs = new TFileStream(AnsiString(pcRep)+pc_SERIE_INFO, fmCreate);
int iL = pteNumSerie->Text.Length(); // Nombre d'octets à écrire
ptfs->Write(pteNumSerie->Text.c_str(), iL); // c_str() renvoie un pointeur de type char*
delete ptfs;
__________________
I walk, shattered soul but unconcerned.
Probably, I'm alive.
Kikof est déconnecté   Réponse avec citation