Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1497 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++]Comment connaitre le répertoire d'installation de windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++]Comment connaitre le répertoire d'installation de windows

n°566799
petit prin​ce
Dessine moi un mouton :)
Posté le 14-11-2003 à 15:32:16  profilanswer
 

le répertoire systeme de windows et la plateforme
 
je sais que String(Win32Platform) permet de donner la plateforme de manière imprécise (3.1 ,95 ou NT)
 
En fait, je dois me connecter à un ftp et je lance ftp.exe avec un shellexecute.
Seulement ftp.exe se trouve dans des répertoires différents!
 
à terme j'aimerai écrire mon programme sans passer par ftp.exe
si vous avez des pistes je suis prenant


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
mood
Publicité
Posté le 14-11-2003 à 15:32:16  profilanswer
 

n°566812
art_dupond
je suis neuneu... oui oui !!
Posté le 14-11-2003 à 15:39:45  profilanswer
 

tu peux récupérer %windir% ?


---------------
oui oui
n°566823
petit prin​ce
Dessine moi un mouton :)
Posté le 14-11-2003 à 15:55:55  profilanswer
 

j'aurai préféré une variable non systeme mais ça m'aide :)
 
connais tu la variable qui donne la plateforme?


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°566853
petit prin​ce
Dessine moi un mouton :)
Posté le 14-11-2003 à 16:16:25  profilanswer
 

sinon j'ai eu une idée lumineuse
Borland comporte aussi un composant TNMFTP !!!!!!!!
ce qui est bcp plus propre!
 
je vais essayer de procéder ainsi


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°566912
Konar
Posté le 14-11-2003 à 16:55:35  profilanswer
 

Pour les répertoires :
UINT GetWindowsDirectory(LPTSTR lpBuffer, UINT uSize);
UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);
 
Pour la version de l'os :
DWORD GetVersion(void);

n°566914
Konar
Posté le 14-11-2003 à 16:57:26  profilanswer
 

et pour faire du FTP :
InternetOpen();
InternetConnect();
puis y a plein de fonctions pour faire du ftp facile : FtpCreateDirectory(), FtpSetCurrentDirectory(), FtpPutFile(), etc.

n°566934
red factio​n
Posté le 14-11-2003 à 17:26:43  profilanswer
 

et le rep de lutilisateur courant comment on fait ? par exemple si on veut placer un fichier sur le bureau ....

n°566942
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-11-2003 à 17:32:34  profilanswer
 

Petit Prince a écrit :


En fait, je dois me connecter à un ftp et je lance ftp.exe avec un shellexecute.
Seulement ftp.exe se trouve dans des répertoires différents!
 


 
tu peux lancer juste ftp.exe. Le dossier de Windows étant dans le path il trouvera ftp.exe tout seul.
 

Petit Prince a écrit :

sinon j'ai eu une idée lumineuse
Borland comporte aussi un composant TNMFTP !!!!!!!!
ce qui est bcp plus propre!


 
TNMFTP c'est un vieux brol.
Ça a été remplacé par TIFTP dans Delphi 6.
Pour les anciennes versions de Delphi ou la version "perso" il faut télécharger Indy : http://www.nevrona.com/Indy/.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°566943
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-11-2003 à 17:34:33  profilanswer
 

red faction a écrit :

et le rep de lutilisateur courant comment on fait ? par exemple si on veut placer un fichier sur le bureau ....


 

Code :
  1. function GetShellPath(csidl: Integer): string;
  2. var
  3.   pidl: PItemIDList;
  4.   buf: array[0..MAX_PATH] of Char;
  5. begin
  6.   Result := '';
  7.   if Succeeded(ShGetSpecialFolderLocation(0, csidl, pidl)) then
  8.   begin
  9.     if ShGetPathfromIDList(pidl, buf) then
  10.       Result := buf;
  11.     CoTaskMemFree(pidl);
  12.   end;
  13. end;


Appelé par :

Code :
  1. s := GetShellPath(CSIDL_DESKTOPDIRECTORY);


 
(faudra probablement inclure la unit ShlObj)


Message édité par antp le 14-11-2003 à 17:34:59

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°566945
red factio​n
Posté le 14-11-2003 à 17:37:19  profilanswer
 

antp a écrit :


 

Code :
  1. function GetShellPath(csidl: Integer): string;
  2. var
  3.   pidl: PItemIDList;
  4.   buf: array[0..MAX_PATH] of Char;
  5. begin
  6.   Result := '';
  7.   if Succeeded(ShGetSpecialFolderLocation(0, csidl, pidl)) then
  8.   begin
  9.     if ShGetPathfromIDList(pidl, buf) then
  10.       Result := buf;
  11.     CoTaskMemFree(pidl);
  12.   end;
  13. end;


Appelé par :

Code :
  1. s := GetShellPath(CSIDL_DESKTOPDIRECTORY);


 
 
(faudra probablement inclure la unit ShlObj)


 
tout ca existe sous visual ?? (je veux dire c du win32 ou des fonctions bricolage a la borland)


Message édité par red faction le 14-11-2003 à 17:42:16
mood
Publicité
Posté le 14-11-2003 à 17:37:19  profilanswer
 

n°566951
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-11-2003 à 17:51:41  profilanswer
 

oups comme il parlait de TNMFTP je pensais que c'était Delphi, au lieu de C++Builder (les deux sont pareils pour les composants, donc mon histoire sur le TIdFTP est encore valable).
Le code que j'ai posté c'est du Delphi, mais qui utilise juste les fonctions de l'API Win32.
 
Donc en fait tu dois faire un appel à ShGetSpecialFolderLocation en passant CSIDL_DESKTOPDIRECTORY comme SDIDL, ça te renvoie un PIDL.
Ensuite un appel à ShGetPathfromIDList en passant le PIDL.
Et enfin libérer l'allocation faite pour le PIDL.
Ça doit passer sans problèmes dans Visual C++ et C++Builder. (dans ce dernier, il faudra probablement inclure ShlObj.hpp)


Message édité par antp le 14-11-2003 à 17:52:26

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°567940
petit prin​ce
Dessine moi un mouton :)
Posté le 16-11-2003 à 01:25:57  profilanswer
 

antp a écrit :

oups comme il parlait de TNMFTP je pensais que c'était Delphi, au lieu de C++Builder (les deux sont pareils pour les composants, donc mon histoire sur le TIdFTP est encore valable).
Le code que j'ai posté c'est du Delphi, mais qui utilise juste les fonctions de l'API Win32.
 
Donc en fait tu dois faire un appel à ShGetSpecialFolderLocation en passant CSIDL_DESKTOPDIRECTORY comme SDIDL, ça te renvoie un PIDL.
Ensuite un appel à ShGetPathfromIDList en passant le PIDL.
Et enfin libérer l'allocation faite pour le PIDL.
Ça doit passer sans problèmes dans Visual C++ et C++Builder. (dans ce dernier, il faudra probablement inclure ShlObj.hpp)


 
oki je regarderai
 
sinon quand je met ftp simplement il me lance ftp dans l'explorateur de windows :(
 
que veut dire "brol"?

n°567941
petit prin​ce
Dessine moi un mouton :)
Posté le 16-11-2003 à 01:26:39  profilanswer
 

Konar a écrit :

et pour faire du FTP :
InternetOpen();
InternetConnect();
puis y a plein de fonctions pour faire du ftp facile : FtpCreateDirectory(), FtpSetCurrentDirectory(), FtpPutFile(), etc.


 
 
merchi ça m'a l'air sympathique comme solution ;)

n°568068
antp
Super Administrateur
Champion des excuses bidons
Posté le 16-11-2003 à 12:55:19  profilanswer
 

Petit Prince a écrit :


 
que veut dire "brol"?
 


 
Je viens de voir que c'est même pas dans le dico [:mlc]
C'est un mot utilisé en Belgique comme synonyme de "machin", "truc", "bidule", etc.
 

Petit Prince a écrit :


merchi ça m'a l'air sympathique comme solution ;)


 
bah le TIdFTP doit pas être beaucoup plus difficile.
Les fonctions citées plus haut utilisent en fait Internet Explorer ; ça a ses avantages et ses inconvénients ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°568934
petit prin​ce
Dessine moi un mouton :)
Posté le 17-11-2003 à 13:52:21  profilanswer
 

TIdFTP est mieux que NMFTP pour quelles raisons?
 
Parce que j'ai un brol :) assez détaillé de NMFTP (exemple d'utilisation etc)


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°569087
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-11-2003 à 16:17:04  profilanswer
 

"un brol de ..." :non:  
dans ce contexte là ça ne va pas, ne tente pas d'utiliser des mots des autres langues sans les connaître :p
 
TIdFTP est une version beaucoup plus récente de TNMFTP.
Petite histoire que Zion avait raconté sur le forum mais que je ne retrouve plus, donc je la reraconte en espérant que ce soit correct :
Les composants "NM..." ont été faits il y a longtemps par NetMasters, qui les a refilés à Borland.
Le gars qui les a faits pour NetMasters n'ayant pas été payé, il a tout foutu en OpenSource sur internet et c'est devenu Indy.
Par la suite, vu qu'Indy était gratuit et mis à jour, Borland a remplacé les composants NetMasters par Indy.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°569120
petit prin​ce
Dessine moi un mouton :)
Posté le 17-11-2003 à 16:36:17  profilanswer
 

antp a écrit :

"un brol de ..." :non:  
dans ce contexte là ça ne va pas, ne tente pas d'utiliser des mots des autres langues sans les connaître :p
 
TIdFTP est une version beaucoup plus récente de TNMFTP.
Petite histoire que Zion avait raconté sur le forum mais que je ne retrouve plus, donc je la reraconte en espérant que ce soit correct :
Les composants "NM..." ont été faits il y a longtemps par NetMasters, qui les a refilés à Borland.
Le gars qui les a faits pour NetMasters n'ayant pas été payé, il a tout foutu en OpenSource sur internet et c'est devenu Indy.
Par la suite, vu qu'Indy était gratuit et mis à jour, Borland a remplacé les composants NetMasters par Indy.


 
 
ah oki
 
suivant tes conseils, je me suis lancé dans TIdFTP
impossible d'utiliser la fonction put (pour remplacer le fichier du serveur par le fichier qui est sur mon ordi)
IdFTP1->Put("coco.txt","coco.txt",true) ;
 
Il me dit que le fichier existe déjà (j'ai essayé de mettre n'importe quel autre nom dans le 2e parametre sans succès)


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°569154
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-11-2003 à 17:07:07  profilanswer
 

Et en ne sépcifiant que le nom du fichier source et pas les deux autres paramètres ?
Et en mettant le chemin complet du fichier source ?
Et en mettant false pour le troisième paramètre ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°569781
gothico
Posté le 18-11-2003 à 13:47:34  profilanswer
 

[:drapo]


Message édité par gothico le 18-11-2003 à 13:47:56

---------------
MOD : Mon PC silencieux  |  Topic Miranda IM
n°569863
bibouchon
Posté le 18-11-2003 à 14:28:00  profilanswer
 

Petit Prince a écrit :


 
 
 
ah oki
 
suivant tes conseils, je me suis lancé dans TIdFTP
impossible d'utiliser la fonction put (pour remplacer le fichier du serveur par le fichier qui est sur mon ordi)
IdFTP1->Put("coco.txt","coco.txt",true) ;
 
Il me dit que le fichier existe déjà (j'ai essayé de mettre n'importe quel autre nom dans le 2e parametre sans succès)


 
tiens essaie ca ca devrait marcher (c fait a l'arrache mais le principe est la):
 

Code :
  1. IdFTP1->Username = "leusername";
  2. IdFTP1->Password = "lepasswordquivabien";
  3. IdFTP1->Host = "ftp.monadresseftp.com";
  4. AnsiString filename = "c:\\toto.txt"; // fichier en local
  5. IdFTP1->Connect(true, IdTimeoutDefault);
  6. TStringList *pList = new TStringList();
  7. IdFTP1->List(pList, ExtractFileName(filename), true);
  8. if(pList->Count > 0)
  9. {
  10.   IdFTP1->Delete(ExtractFileName(filename));
  11. }
  12. delete pList;
  13. IdFTP1->Put(filename, ExtractFileName(filename), false);
  14. IdFTP1->Disconnect();


n°569981
petit prin​ce
Dessine moi un mouton :)
Posté le 18-11-2003 à 15:48:28  profilanswer
 

voilà avec le chemin complet ça marche ...
 
sinon les 2 autres trucs j'avais essayé
merci


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°569982
petit prin​ce
Dessine moi un mouton :)
Posté le 18-11-2003 à 15:50:18  profilanswer
 

bibouchon a écrit :


 
tiens essaie ca ca devrait marcher (c fait a l'arrache mais le principe est la):
 

Code :
  1. IdFTP1->Username = "leusername";
  2. IdFTP1->Password = "lepasswordquivabien";
  3. IdFTP1->Host = "ftp.monadresseftp.com";
  4. AnsiString filename = "c:\\toto.txt"; // fichier en local
  5. IdFTP1->Connect(true, IdTimeoutDefault);
  6. TStringList *pList = new TStringList();
  7. IdFTP1->List(pList, ExtractFileName(filename), true);
  8. if(pList->Count > 0)
  9. {
  10.   IdFTP1->Delete(ExtractFileName(filename));
  11. }
  12. delete pList;
  13. IdFTP1->Put(filename, ExtractFileName(filename), false);
  14. IdFTP1->Disconnect();


 


 
g compris ton raisonnement :)
en fait le message d'erreur renvoyé est incorrect d'où mon erreur
 
merci de t'être penché sur mon pb!


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°569985
petit prin​ce
Dessine moi un mouton :)
Posté le 18-11-2003 à 15:53:16  profilanswer
 

Pour finir je vais quand meme la soluce au cas où d'autre personne tombent dessus
 

Code :
  1. AnsiString chemin = ExtractFilePath(Application->ExeName) ;
  2. AnsiString chemNouveautes = chemin + "nouveautes.asp" ;
  3. ....
  4. IdFTP1->Put(chemNouveautes,"nouveautes.asp",false) ;


 
et le dernier paramètre est le booléen du "append"?


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°570130
bibouchon
Posté le 18-11-2003 à 17:54:29  profilanswer
 

Petit Prince a écrit :

Pour finir je vais quand meme la soluce au cas où d'autre personne tombent dessus
 

Code :
  1. AnsiString chemin = ExtractFilePath(Application->ExeName) ;
  2. AnsiString chemNouveautes = chemin + "nouveautes.asp" ;
  3. ....
  4. IdFTP1->Put(chemNouveautes,"nouveautes.asp",false) ;


 
et le dernier paramètre est le booléen du "append"?


 
oui.
Extrait de la doc de TIdFTP.Put :
 
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
 
Put is an overloaded procedure that uploads data to a file with the name specified in ADestFile on the FTP server. The uploaded data can be either a stream (ASource) or a name of a file which exists on the user's computer (ASourceFile).
Setting AAppend to True causes the server to append the file being uploaded to one which already exists on the FTP server.

n°571660
petit prin​ce
Dessine moi un mouton :)
Posté le 20-11-2003 à 15:37:43  profilanswer
 

J'en profite puisque je suis ave cdes connaisseurs des composants d'Indy
 
Je cherche une fonction qui me permettrai de savoir les octects reçus (pour faire une barre de progression lorsque j'upload le fichier)
J'ai pas mal cherché et rien trouvé :(
Je sais que les composants NM le permettent
BytesRecvd
BytesSent
 
j'ai l'impression que les composants Indy ne le permettent pas ;(


Message édité par petit prince le 20-11-2003 à 15:41:26

---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°571661
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-11-2003 à 15:38:58  profilanswer
 

Il y a un événement qui permettait de faire ça dans le TIdHTTP, il doit bien y avoir ça dans le TIdFTP, non ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°571668
petit prin​ce
Dessine moi un mouton :)
Posté le 20-11-2003 à 15:43:05  profilanswer
 

antp a écrit :

Il y a un événement qui permettait de faire ça dans le TIdHTTP, il doit bien y avoir ça dans le TIdFTP, non ?


 
apparemment non, ou alors ce n'est pas documenté dans l'aide
je pensais faire appel à vous (au cas où vous la connaissiez)
 
je vais voir si des sites en parlent, sinon je vais ptet utiliser les composants NM
 
est-ce qu'un truc comme ça pourrait etre utilisé?
RecvBufferSize
Indicates the current size of the default receive buffer for the connection.
 
 
property RecvBufferSize: Integer;
 
Description
 
RecvBufferSize is an Integer property that represents the number of bytes currently allocated to the default receive buffer used for the connection.
The default value for RecvBufferSize is 8192 bytes, and is asssigned in Create.
Use ExtractXBytesFromBuffer to remove data from the receive buffer.


Message édité par petit prince le 20-11-2003 à 15:45:48

---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°571802
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-11-2003 à 17:00:47  profilanswer
 

http://www.developpez.net/forums/viewtopic.php?t=96484
 
Il n'y a pas un équivalent dans le TIdFTP ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°571804
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-11-2003 à 17:02:35  profilanswer
 

Après une recherche de quelques secondes, ces événements existent aussi dans le TIdFTP :o
Heureusement que j'avais dit de regarder dans les events parce qu'il en existait qui faisaient ça [:kiki]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°572593
petit prin​ce
Dessine moi un mouton :)
Posté le 21-11-2003 à 14:50:26  profilanswer
 

Ah ça y est j'ai vu, merci
 
Désolé comme tu peux voir, je suis encore débutant et j'ai pas encore les bons automatismes. (je cherche pas bien etc..)
(meme avec ta réponse, j'avais pas trouvé!!! :( rho)
 
Et pourtant je t'assure que j'ai cherché avant de demander


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°572738
petit prin​ce
Dessine moi un mouton :)
Posté le 21-11-2003 à 16:59:10  profilanswer
 

Pour utiiser intercept, apparemment il faut l'associer à un IdLogDebug  
et mettre intercept enable à true  
 
mais apres la fonction Recv renvoie tout le tps 0  
à quoi sert elle alors?  
 
Merci bcp, j'ai pas mal cherché et rien trouvé!  
 
****************** function Recv ***************************  
Performs read operations for the socket handler.  
 
function Recv(var ABuf; ALen: Integer): Integer; virtual;  
 
Parameters  
 
var ABuf  
 
Pointer to the buffer for received data.  
 
ALen: Integer  
 
Number of bytes to read, or size of the memory buffer.  
 
Returns  
 
Integer - Number of bytes received. Default Value is 0.  
 
Description  
 
Recv is an Integer function that performs read operations for the Binding that represents the socket connection. When the TIdConnectionIntercept component is enabled and RecvHandling is indicated, Recv is the method used to perform all read operations instead of the Recv method for the Binding.  
 
Recv is used in conjunction with DataReceived to allow the TIdConnectionIntercept to perform transformations for any data read from the protocol stack.  
 
Note: Recv is a virtual method in TIdConnectionIntercept and always returns 0 as the result value. Descendant classes should implement Recv to perform socket read operations appropriate for the socket handler.


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°572797
antp
Super Administrateur
Champion des excuses bidons
Posté le 21-11-2003 à 18:27:00  profilanswer
 

Pourquoi t'emploies pas les événements OnWork ? :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°576653
petit prin​ce
Dessine moi un mouton :)
Posté le 26-11-2003 à 14:37:36  profilanswer
 

Voilà mon programme marche bien
j'aurai une petite question lorsque je fais un upload, j'ai plus la main pour les boutons
j'aimerai donner le droit à l'utilisateur d'arrêter l'upload,
il y a une fonction IdFTP->abort() mais comme j'ai pas la main ....
C'est un cercle vicieux!!


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°576677
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-11-2003 à 14:47:15  profilanswer
 

Soit tu mets ton composant IdFTP dans un thread, soit tu utilises le composant IdAntiFreeze (ou un truc du genre).
La première solution est meilleure, mais si tu n'as jamais utilisé les threads ...


Message édité par antp le 26-11-2003 à 14:47:25

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°576692
petit prin​ce
Dessine moi un mouton :)
Posté le 26-11-2003 à 14:57:26  profilanswer
 

oui le anti freeze je l'ai utilisé parce que j'avais un bouton qui disparaissait (passait en blanc)
 
je vais regarder du coté du thread
tiens y a un article sympa dessus :)
http://chgi.developpez.com/thread/


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°576695
petit prin​ce
Dessine moi un mouton :)
Posté le 26-11-2003 à 14:59:06  profilanswer
 

bon je viens de regarder c'est exactement ce que je veux faire :)
 
par contre c'est pas évident :)


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
n°576766
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-11-2003 à 15:49:18  profilanswer
 
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++]Comment connaitre le répertoire d'installation de windows

 

Sujets relatifs
portabilité windows/Linux du codeLister les fichiers (nom...) d'un repertoire sous windows en C++
Prog windowsPb Ant sous Windows
[Delphi] API windows, copyfileprogrammation socket sous windows
Liste des caractères interdits dans les noms de fichiers windowsconnaitre le temps d'execution d'un script?
Programmation en shell linux sous windows 
Plus de sujets relatifs à : [C++]Comment connaitre le répertoire d'installation de windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR