Directory contenente l'eseguibile c#

domenica 21 settembre 2008 - 10.24

skas Profilo | Newbie

Ciao a tutti.
Vi espongo il mio problema.
Ho un programma che controlla se un determinato processo è attualmente in esecuzione sul computer. Di questo processo vorrei conoscere il nome della cartella in cui è contenuto l'exe (nota bene: mi serve solo il nome della cartella e non tutto il path completo) e sapere quali sono i parametri passati dalla riga di comando al momento dell'avvio del programma.
Uso visual studio con il framework 1.1.

Grazie

Dome

Brainkiller Profilo | Guru

>Ciao a tutti.
>Vi espongo il mio problema.
>Ho un programma che controlla se un determinato processo è attualmente
>in esecuzione sul computer. Di questo processo vorrei conoscere
>il nome della cartella in cui è contenuto l'exe (nota bene: mi
>serve solo il nome della cartella e non tutto il path completo)

Io ti fornisco il Path poi con delle Split puoi andare a recupeare le varie cartelle che compongono il Path e prendere l'ultima o quella che ti serve.

>e sapere quali sono i parametri passati dalla riga di comando
>al momento dell'avvio del programma.

Non so se è possibile recuperare i parametri da riga di comando.

Comunque il codice è il seguente:

Process[] t=System.Diagnostics.Process.GetProcesses(); foreach (Process a in t) { try { Console.WriteLine(Path.GetDirectoryName(a.MainModule.FileName)); } catch (Exception ex) { Console.WriteLine(ex.Message); } }

N.B. Non è possibile recuperare l'eseguibile di tutti i processi.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

skas Profilo | Newbie

Ho scoperto che mi basta trovare il percorso completo dell'eseguibile (senza il nome dell'eseguibile) e non solo la cartella dove è contenuto; ho allegato il codice di come l'ho fatto (è abbastanza simile al tuo,no?).
Il mio problema resta come trovare i parametri passati a un programma che ora è in esecuzione...spero in qualche idea!



string name = "notepad"; System.Diagnostics.Process[] myProcess = System.Diagnostics.Process.GetProcessesByName(name); foreach (System.Diagnostics.Process instance in myProcess) if( instance.ProcessName == name) { ProcessModule myProcessModule; myProcessModule = instance.MainModule; string fullpath = myProcessModule.FileName.ToString(); string directoryString = Directory.GetParent(fullpath).ToString(); MessageBox.Show(directoryString); }
Dome

aiedail92 Profilo | Expert

Ciao

Un metodo che dovrebbe ottenere sempre i risultati è quello di appoggiarsi all'API QueryFullProcessImageName:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Invece per ottenere gli argomenti della riga di comando, la soluzione credo sia una sola: usare la "Code Injection". La tecnica consiste nella creazione di un thread da far eseguire sul processo bersaglio, il quale ottiene le informazioni necessarie (nel nostro caso chiama l'API GetCommandLine) e le riporta al processo chiamante. Il tutto è "abbastanza" semplice da fare in C/C++, ma per il C# le cose si complicano (fino a divenire quasi impossibili), perchè diventa difficile la gestione e la conversione fra memoria gestita e non gestita. La cosa più semplice da fare quindi è scrivere una libreria in C++ e appoggiarsi a quella per eseguire l'operazione. Puoi trovare qui un esempio in C++ (il codice vero e proprio è in remthread.cpp):

http://win32.mvps.org/processes/remthread.html

Luca

aiedail92 Profilo | Expert

Ciao

Se non hai già risolto, ti rimando a quest'altro post dove ho ritrattato la questione col codice e con delle dll scritte da me in C++:

http://www.dotnethell.it/forum/messages.aspx?ThreadID=25428

Luca

skas Profilo | Newbie

Grazie mille: risolto. quello della dll e delle api in codice c++ credo effettivamente sia l'unica soluzione percorribile. very thanks
Dome
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5