Je voudrai savoir comment il faut faire pour compiler un code source en C++ qui créerait un exécutable ( logique) mais qui en plus se copierait dans un répertoire précis ( vous me suivez ? )
Exemple :
Compile, linke etc.
On sort un . exe
Ce . exe ( quand on le lance) se copie dans un répertoire spécifié.
On m´a dit qu´il fallait utiliser des fonctions dos prédéfinies dans la liib C, j´y ai regardé mais je n´ai pas trouvé mon bonheur, et sur Google je n´ai pas trouvé de tutos pour ça
Bref, pour tout vous dire je voudrai que ce programme se copie dans le répertoire Démarrage de Windows ( ne vous inquiétez pas je ne veux pas faire de gros virus trop méchants qui détruisent tout, juste une blague à un copain ^^).
Or, ce répertoire se trouve ( sous XP) dans
C://Documents and Settings/User/Menu Démarrer/Programme/
le problème étant que je connais pas " User" ( eh oui je ne connais pas le nom de la station de travail :/) donc je voudrai savoir s´il y avait un autre moyen d´y accéder, merci ![]()
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp
mais on ne copie pas des programmes dans le menu Démarrer ! ! seulement des raccourcis..
si c´est pour lancer ton programme au démarrage de windows ya mieux . .. suffit de créer un clé en base de registre dans :
HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre
ntVersion\Run
tu y mets le chemin vers ton programme
Euh ok c´est sympa de vouloir m´aider mais niveau prog je suis un newbie débutant :D J´exagère peut-être un peu mais modifier une clé dans la base de registre je sais pas faire moi ![]()
ah ok désolé
voici le bout de code pour faire ca :
HKEY hKey;
char *pCheminVersTonProgramme = " C:\LeChemin\Vers\Ton\Programme.exe";
if (
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\
\Windows\\CurrentVersion\\Run",&) == ERROR_SUCCESS )
{
if
(Je_veux_lancer_mon_programme_au_demarrage_de_Wind
ows)
RegSetValueEx(hkey,"UnNomPourMonProgramme",0,REG
_SZ,(unsigned char
gramme));
else
RegDeleteValue(hkey,"UnNomPourMonProgramme");
RegCloseKey(hkey);
}
altonfrère, ça va pas, car il ne connait pas le chemin vers son exécutable.
si vous voulez, j´ai écrit une lib sympa pour un accès ultra-simplifié à la base des registre et quelques autres petites fonctions ( presse papier entre autre) que je peut vous passer.
mais pour avoir le nom de l´utilisateur il suffit d´utiliser la fonction GetUserName :
long size=128;
char name[128];
GetUserName(name,(LPDWORD)&);
et name contient le nom par lequel il faut remplacer user.
bin pour le chemin vers son exe suffit d´utiliser la fonction :
char ModulePath[_MAX_PATH];
GetModuleFileName(NULL,ModulePath,MAX_PATH);
sinon pour faire ce qe tu veux, si tu vas ici:
C:\Documents and Settings\All Users\Menu Démarrer\Programmes\Démarrage
Tu crées un raccourci vers le programme ( ou tu copies ton programme dedans, comme tu veux) jpense que ça peut fonctionner non?
Je vois toujours pas l´intérêt de copier un programme complet dans le menu démarrer ! on y met des raccourcis à la limite mais c´est tout !
Sinon pour la base de registre je n´y vois aucun problème, c´est plus propre car suivant le windows sur lequel vous allez faire la manip le répertoire Démarrer peut s´appeler StartUp ou Start ( pour la version anglaise) etc... Bon il existe également une fonction pour récupérer le répertoire démarrer quelle que soit la traduction . ..
le menu démarer est donné par une clef dans la base des registres. ce qui nous fait revenir au problème précédent.
dans HKCU :
"Software\Microsoft\Windows\CurrentVersion\Explore
r\Shell Folders"
valeur " Startup"
y a un truc qui renvoit vers le dossier . ..\Mathieu ( pour moi):
%HOMEDRIVE%%HOMEPATH%, tu px pas t´en servvir?
Ben dis-donc c´est bien plus compliqué que ce que j´imaginais, je vais me pencher sur le problème
Pour GetUserName, il faut quelle lib ?
Merci à vous ![]()
windows.h
mais effectivement le truc de mathieu marche très bien, il faut juste utilisé la fonction qui permet de remplacer le %truc% par leur valeur, je me souviens plus de la fonction, l´une des méthode est de passer par le registre.
Mais en exclusivité rien que pour toi, voici LA fonction : extraite toute droit de la MSDN avec la librairie la plus bizarer que j´ai jamais vu, pourtant ça marche parfaitement.
void main()
{
char chem[MAX_PATH];
SHGetFolderPath(NULL,CSIDL_STARTUP,0,SHGFP_TYPE_CU
RRENT,chem);
cout < < chem;
cin > > chem;
}
le truc qui est coupé en 2 est une seule constante :
SHGFP_TYPE_CURRENT
je viens de tester avec devc++ le problème c´est que SHGFP_TYPE_CURRENT n´est pas défini, donc mets sa valeur, c´est 0
SHGetFolderPath(NULL,CSIDL_STARTUP,0,0,chem);
elle est bizarre cette fonction, elle sort pas de l´API win32, mais d´un truc qui s´appelle le windows shell, j´ai jamais vraiment prété attention à ça avant et je vois pas trop à quoi ça correspond.
Je crois que je vais aller me rhabiller :D
Enfin merci quand même ![]()
C´est quoi ce MAX_PAH? ça fait 2-3 fois que je le vois, et je ne comprends pas à quoi elle sert
chaos_clad, il suffit que tu utilise les 3 lignes que je t´ai passé et ça marche parfaitement sans aucun problème.
Mathieu : MAX_PATH c´est juste une constante définit par les en tête standard ( genre windows.h ou autre) qui définit la taille maximale en nombre de caractère que peut faire un chemin d´accès.
essaye de créer une arborescence avec des nom de dossier très très long et tu verra que vers 250 caractères, tu ne peut plus créer de dossier.
Oui ça marche, mais recopier bêtement c´est pas trop mon truc ![]()
bah dans ce cas là, je t´explique :
c´est tout con : la fonction fait exactement ce que tu veux elle te renvoie le chemin d´accès pour un dossier donnée.
le premier paramètre doit être null ( en fait c´est un hwnd mais il ne sers à rien si l´appli tourne avec le même nom d´utilisateur que celui qui est ouvert) le deuxième paramètre est une constante qui identifie la chaine que tu veux, le troisième argument est l´utilisateur auquel tu te réfers, celui en cours si le paramètre est 0.
Le 4ième arguments est si tu veux avoir le vrai chemin ( 0) où le chemin par défaut ( 1) et en dernier un buffer de la bonne taille.
voila, maintenant que tu as compris ce n´est plus recopier betement.
En plus, tu ne trouvera pas mieux comme fonction, et en info c´est en recopient qu´on apprend ( en faisait aussi, mais une fonction que tu connait pas, il faut bien qu´un jour qqn te la montre).