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

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

Marsh Posté le 14-11-2003 à 15:32:16    

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!
Reply

Marsh Posté le 14-11-2003 à 15:32:16   

Reply

Marsh Posté le 14-11-2003 à 15:39:45    

tu peux récupérer %windir% ?


---------------
oui oui
Reply

Marsh Posté le 14-11-2003 à 15:55:55    

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!
Reply

Marsh Posté le 14-11-2003 à 16:16:25    

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!
Reply

Marsh Posté le 14-11-2003 à 16:55:35    

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);

Reply

Marsh Posté le 14-11-2003 à 16:57:26    

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

Reply

Marsh Posté le 14-11-2003 à 17:26:43    

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

Reply

Marsh Posté le 14-11-2003 à 17:32:34    

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
Reply

Marsh Posté le 14-11-2003 à 17:34:33    

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
Reply

Marsh Posté le 14-11-2003 à 17:37:19    

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
Reply

Marsh Posté le 14-11-2003 à 17:37:19   

Reply

Marsh Posté le 14-11-2003 à 17:51:41    

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
Reply

Marsh Posté le 16-11-2003 à 01:25:57    

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"?

Reply

Marsh Posté le 16-11-2003 à 01:26:39    

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 ;)

Reply

Marsh Posté le 16-11-2003 à 12:55:19    

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
Reply

Marsh Posté le 17-11-2003 à 13:52:21    

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!
Reply

Marsh Posté le 17-11-2003 à 16:17:04    

"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
Reply

Marsh Posté le 17-11-2003 à 16:36:17    

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!
Reply

Marsh Posté le 17-11-2003 à 17:07:07    

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
Reply

Marsh Posté le 18-11-2003 à 13:47:34    

[:drapo]


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

---------------
MOD : Mon PC silencieux  |  Topic Miranda IM
Reply

Marsh Posté le 18-11-2003 à 14:28:00    

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();


Reply

Marsh Posté le 18-11-2003 à 15:48:28    

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


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
Reply

Marsh Posté le 18-11-2003 à 15:50:18    

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!
Reply

Marsh Posté le 18-11-2003 à 15:53:16    

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!
Reply

Marsh Posté le 18-11-2003 à 17:54:29    

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.

Reply

Marsh Posté le 20-11-2003 à 15:37:43    

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!
Reply

Marsh Posté le 20-11-2003 à 15:38:58    

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
Reply

Marsh Posté le 20-11-2003 à 15:43:05    

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!
Reply

Marsh Posté le 20-11-2003 à 17:00:47    

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
Reply

Marsh Posté le 20-11-2003 à 17:02:35    

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
Reply

Marsh Posté le 21-11-2003 à 14:50:26    

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!
Reply

Marsh Posté le 21-11-2003 à 16:59:10    

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!
Reply

Marsh Posté le 21-11-2003 à 18:27:00    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-11-2003 à 14:37:36    

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!
Reply

Marsh Posté le 26-11-2003 à 14:47:15    

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
Reply

Marsh Posté le 26-11-2003 à 14:57:26    

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!
Reply

Marsh Posté le 26-11-2003 à 14:59:06    

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!
Reply

Marsh Posté le 26-11-2003 à 15:49:18    

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed