Pfad eines Programs herausfinden



  • Hallo,

    ich muss ein Programm zur Automatisierung schreiben.

    Dieses Programm ruft ein anderes Programm auf, bei dem ich aber nicht sicher bin wo dieses sich befindet.

    Wie mach ich das denn am elegantesten?

    Ich habe schon gegoogelt, da finde ich nur wie ich den eigenen pfad bekomme. das möchte ich ja nicht sondern irgendeines Programms. Kann ich das iwi durch die Registry herausfinden?



  • Wenn es sich in der Registry eingetragen hat und da auch der Pfad zum Programm steht kann man das sicher raus finden. An sonsten würde ich alle verfügbaren Datenträger durchsuchen, kann aber halt bissel dauern, aber wenn man davon aus geht dass das Programm nicht auf wanderschaft geht muss man das ja nur einmal machen und dann kann man sich ja den Pfad irgendwo notieren (Registry, Inf-Datei, Konfig-File).



  • Vielen Dank für deine Antwort, das suchen dauert ja bekanntlich sehr lang. Ich könnte die Standardpfade überprüfen und wenn ich diese nicht finde soll es der Benutzer selbst angeben beim öffnen des Programs.

    Was haltet ihr von dieser Idee?



  • Ich könnte die Standardpfade überprüfen und wenn ich diese nicht finde soll es der Benutzer selbst angeben beim öffnen des Programs.

    Genau so würde ichs machen. Wenn der Benutzer das Programm nicht dorthin tut wo du es erwartest muss er halt festlegen wo es ist. 😃
    Alternativ kannst du ja auch eine (optionale) automatische Suche anbieten falls das Programm nicht im Standardpfad liegt, aber ich würde das einfach den User machen lassen.



  • Danke für die Antwort.

    Es gibt ja so "Variablen" für Pfade wie "C:\Program Files (x86)\" wie ist denn das Schlagwort dafür?



  • Die heißen Umgebungsvariablen.
    Auslesen geht z.B. so:

    #include <cstdlib>
    #include <string>
    std::string getEnvironmentVariable(std::string name)
    {
    	char* temp = getenv(name.c_str());
    	if(temp != NULL)
    		return temp;
    	return "";
    }
    
    int main()
    {
    	std:string programs = getEnvironmentVariable("PROGRAMFILES");
    	return 0;
    }
    


  • Vielen Dank für deine Antwort,

    kann ich getenv ohne bedenken benutzen oder sollte ich lieber auf die umständliche Variante der sicheren Funktionen zurückgreifen.



  • Welche "sicherere" Variante meinst du denn ?
    Wenn du die Funktion so benutzt kann nicht viel passieren, du musst nur auf Null-Pointer aufpassen (hab ich ja schon eingebaut) und darfst weder in den zurückgegebenen String schreiben, noch ihn versuchen freizugeben.
    Deshalb ja die Kopie als std::string.



  • Hallo,

    du kannst die laufenden Prozesse iterieren und Dir Informationen
    über diese beschaffen, da ist auch der Programpath enthalten.

    Das geht freilich nur wenn der Prozess bereits abläuft.

    PseudoCode! :

    PROCESSENTRY32 process;process.dwSize=sizeof(PROCESSENTRY32);
    
    	HANDLE handle(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0));
    	if(!handle)
    	 return -1;
    
    	Process32First(handle,&process);
    	do
    	{
    		//(process.szExeFile,pAppName,strlen(pAppName)))
    	   _tprintf(L"PID(0x%x) NAME(%s)\r\n",process.th32ProcessID, &process.szExeFile[0]);
    	}while(Process32Next(handle,&process));
    

  • Mod

    Dafür gibt es
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths



  • Hallo Martin Richter,

    in diesem Ordner finde ich nur svn, sonst ist da nichts drinn.


  • Mod

    Dann schaust Du falsch nach.
    In diesem Verzeichnis ist jedes Setup Programm gehalten den Pfad der primären EXE einzutragen. Siehe MSDN.


Log in to reply