C ++ ansøgning autorun på Windows boot

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg udvikler en ansøgning i C ++, der har en option 'autostart'. Når brugeren indstiller denne mulighed, skal programmet ændres noget i Windows, der startes af Windows på næste Windows-opstart og brugerlogon. Også når brugeren afbryder denne indstilling, skal programmet sætte tingene tilbage.


Jeg behøver ikke at køre app som en tjeneste, så det ville nok være at køre under visse brugeres konto efter brugerlogon. Så hvad er den bedste måde at få Windows til at køre min app på. på næste opstart og bruger login? Jeg googled et råd til at bruge en startmappe. Er det mest skønne og harmløse måde?


Hvis ja, har jeg 2 spørgsmål:



  1. Sådan registreres startfolderen. Jeg er ikke tilfreds med SHGetSpecialFolderLocation () s output. Det ser ud til, at det returnerer mit 'HOME' -katalog i test af WinXP-platformen (C: \ Documents and settings \\% brugernavn\%).

  2. Hvordan oprettes .lnk-fil ved hjælp af C ++ der? Jeg tror, ​​at kopiering af hele .exe-filen ville være en dårlig ide.



Faktisk er mit program cross-platform, men en mulighed 'autostart' vil kun være Windows-only.


Opdater



  1. Prøvede SHGetSpecialFolderLocation og fik en god værdi i Windows7: 'C: \ Users \ Pavel \ AppData \ Roaming \ Microsoft \ Windows \ Startmenu \ Programmer \ Startup'
    BEMÆRK: Hvis du bruger MinGW, skal du definere \_WIN32\_IE til 0x0400, før du inkluderer ShlObj.h.

  2. Hvad er den bedste løsning (i betragtning af god programmering) mellem at bruge registreringsdatabasen (HKEY\_CURRENT\_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run) og opstartsmappen?


Bedste reference


Jeg foreslår at bruge registreringsnøgler som HKEY\_LOCAL\_MACHINESoftwareMicrosoftWindowsCurrentVersionRun Opret en strengværdi her med navnet på din software og værdien af ​​din primære eksekverbare sti - det skal være tilstrækkeligt. Det er meget lettere at oprette en. Lnk-fil - og registreringsdatabase-redigering API er let tilgængeligt fra C ++


UPDATE:


Som @Ben foreslog, er det bedre at bruge HKEY\_CURRENT\_USERSoftwareMicrosoftWindowsCurrentVersionRun til din opgave. Dette vil autostart din app kun for den aktuelle bruger, mens mit første forslag vil gøre det for alle brugere.


Update2:


Bemærk også, at uanset hvilken metode du vælger til at implementere autostart, kan du få problemer med antivirussoftware, da de fleste af antivirusser med proaktivt forsvar følger nøje for at gøre programmer automatisk kørende.

Andre referencer 1


Bare for at være klar, starter opstart mapperne ved login tid, IKKE boot. Det lyder som hvad du vil, jeg vil bare få vilkårene lige.


Jeg tror, ​​du faktisk vil have SHGetSpecialFolderPath og CSIDL\_STARTUP konstanten. Hvis jeg læser docs korrekt, bør det give dig den vej, du vil have. [3] [4]

Andre referencer 2


Bestem stien til startmappen ved hjælp af SHGetSpecialFolderPath (se Michael Kohne s svar).


Brug derefter IShellLink for at oprette en genvej i denne mappe. [5]


Rediger: Jeg tror at bruge Run-tasten i registreringsdatabasen er mere pålidelig.