c - CreateProcessA\% appdata\%

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge CreateProcessA for at kalde en ansøgning under \%appdata\% biblioteket.


For eksempel ved at bruge følgende:


CreateProcessA(
    NULL, "\%appdata\%myfile.exe", NULL, NULL, FALSE,
    CREATE\_NO\_WINDOW, NULL, NULL, &sI, &pI
);


Skal jeg bruge den komplette sti, når du ringer til myfile.exe eller er der someway jeg kan bruge \%appdata\% i opkaldet til CreateProcessA?

Bedste reference


Som det fremgår af MSDN, og da du NULL går til CreateProcessA som et første argument, spiller CreateProcessA s 2. argument: lpApplicationName rollen som kommandolinjen at blive udført. Medmindre lpApplicationName peger på en exe i en mappe, vil systemet søge efter det i følgende rækkefølge [24]



  

      
  1. Den mappe, hvorfra applikationen er indlæst.

  2.   
  3. Den nuværende mappe til overordnet proces.

  4.   
  5. 32-bit Windows-systemkatalogen. Brug GetSystemDirectory
          funktion for at få stien til denne mappe

  6.   
  7. 16-bit Windows-systemkatalogen. Der er ingen funktion der
          henter stien i denne mappe, men den søges. Navnet på
          denne mappe er System. Windows-mappen. Brug
          GetWindowsDirectory-funktionen for at få stien til denne mappe.

  8.   
  9. De mapper, der er angivet i PATH-miljøvariablen.
          Bemærk, at denne funktion ikke søger efter applikationsbanen
          specificeret af registreringsnøglen App Paths. At inkludere dette
          per-applikationssti i søgeordet, brug ShellExecute
          funktion.

  10.   



Derfor, medmindre andet argument af CreateProcessA er i formularen {directory}/{executable\_name}.{ext}, skal du enten:



  1. Anbring eksekverbarnavn i den samme mappe, hvorfra applikationen er indlæst

  2. Anbring eksekverbarnavn i samme mappe i overordnet proces

  3. Placer executable\_name i mappen Windows System32: C: \ Windows \ System32

  4. Placer eksekverbarnavn i Windows-mappen: C: \ Windows

  5. Medtag biblioteket, hvor executable\_name er i PATH



Som sagt af Ben, kig på ExpandEnvironmentStrings for at ændre PATH env-variabel. [25]

Andre referencer 1


Den anden parameter i CreateProcess skal være en skrivbar buffer. Hvis din eksekverbare sti ikke indeholder kommandolinjeparametre, skal du sætte den eksekverbare sti i den første parameter og lade den anden parameter NULL


For Windows Vista og over brug SHGetKnownFolderPath


FOLDERID\_LocalAppData returnerer "c:\users\username\AppData\Local"

FOLDERID\_RoamingAppData returnerer "c:\users\username\AppData\Roaming"


ExpandEnvironmentStrings("\%APPDATA\%", ...) returnerer samme som FOLDERID\_RoamingAppData


Du skal bruge Unicode, medmindre du er sikker på at brugernavnet er ANSI-kompatibelt.


wchar\_t *ptr;
if(S\_OK == SHGetKnownFolderPath(FOLDERID\_RoamingAppData, 0, NULL, &ptr))
{
    //or FOLDERID\_LocalAppData
    std::wstring path = ptr;
    CoTaskMemFree(ptr);

    STARTUPINFOW si = { sizeof(si) };
    PROCESS\_INFORMATION pi;
    path += L"\myfile.exe";
    CreateProcessW(NULL, &path[0], NULL, NULL, FALSE, 
            CREATE\_NO\_WINDOW, NULL, NULL, &si, &pi);
}