Dateiname eines Prozesses
-
Hey.
Ich bin mal wieder Sprachlos...
Mein Windows bringt mich mal wieder zur Weißglut.Es verbietet mir aus meinem Programm den Dateipfad mancher Programme zu ermitteln. Z. B. Paint und andere Windows-Anwendungen.
string path = Process.GetProcessesByName(irgendeineVariable)[0].MainModule.FileName;
, beantwortet Windows schlicht mit
System.ComponentModel.Win32Exception schrieb:
Zusätzliche Informationen: Ein 32-Bit-Prozess kann nicht auf Module eines 64-Bit-Prozesses zugreifen.
Wie soll ich das Lösen?? Es muss doch irgendeine Möglichkeit geben.
Bis jetzt hab ich das Problem nur bei notepad, paint etc. gefunden. Ich könnte daher bei einer solchen Fehlermeldung zwar einfach den Prozessnamen um "*.exe" ergänzen, fände dies aber stillos und unsauber.
Liebe Grüße Darius.
-
http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/
Ist kompliziert, aber machbar.
Was willst du denn erreichen?
-
Wow.. Das ging ja flott!!
Danke ich seh mir das mal an.Ich mag einen anderen Prozess neu starten..
Sprich
foreach(Process p in Process.GetProcessesByName(beliebigerString) { p.Kill(); // p.Start(); >> funktioniert nicht!! Process.Start(p.MainModule.FileName); }
nur, dass ich halt ne Alternative bräuchte für p.MainModule.FileName, aber der Artikel sieht ja ganz nützlich aus..
LG
-
Mögliche Alternative: WMI verwenden
var wmiQueryString = "SELECT ProcessId, ExecutablePath, CommandLine FROM Win32_Process WHERE Name = \"{0}\""; wmiQueryString = String.Format(wmiQueryString, "explorer.exe"); using(var searcher = new ManagementObjectSearcher(wmiQueryString)) using(var results = searcher.Get()) { foreach(var item in results.Cast<ManagementObject>()) { Console.WriteLine(item["ExecutablePath"]); } }
Grüssli
-
Auch Dir vielen Dank Dravere.
Iwie findet mein Visual Studio den ManagementObjectSearcher und ManagementObject nicht.
Ich habe wie auf MSDN angegeben System.Management eingebunden. Was mach ich falsch?? Meine IntelliSense bietet mir auch nirgends was an.
[EDIT]
Ups.. Tschuldigung.. Hatte den Verweis nicht hunzugefügt.
-
Okey.. Lol..
Und wie verwende ich das jetzt für andere Programme..
Sobald ich 'explorer.exe' durch irgendwas ersetze, gehts nicht mehrIch steig da nicht ganz durch. Kannst du mir den Code vielleicht nochmal erklären. Immer Copy-Paste ist nicht so toll. Man sollte verstehen was man tut.
Und das tue ich in dem Fall nichtDanke..
-
WMI ist die Windows Management Instrumentation. Grundsätzlich ist WMI für das Remote Management von Computer durch Administratoren eines Netzwerkes gedacht.
WMI setzt SQL ähnliche Abfragen ein. Man fragt z.B. nach einer Art von Objekt mit gewissen Eigenschaften. Ich starte hier eine Anfrage nach den Windows Prozessen (Win32_Process Class) auf dem lokalen Computer, welche einen entsprechenden Namen haben.
Mehr ist da eigentlich nicht mehr zu erklären. Ausser du willst dich genauer mit WMI auseinander setzen, dann gibt es da jede Menge Material in der MSDN:
Windows Management InstrumentationWichtig ist hier vielleicht noch, dass der Name inklusiv der Extension ist im Gegensatz zu
Process.ProcessName
. Also eben "explorer.exe" und nicht nur "explorer".Grüssli
-
Warum so kompliziert ?
Zusätzliche Informationen: Ein 32-Bit-Prozess kann nicht auf Module eines 64-Bit-Prozesses zugreifen.
sagt doch schon alles. Einfach dein C# Projekt auf x64 oder Any Cpu umstellen und es läuft ohne Probleme. Da ist doch kein hochkomplexer Umweg nötig ?
-
Hast Recht - Danke. Darüber hatte i h auch schon nachgedacht, aber kann dann denn ein 64er Prozess auf die Module eines 32 bit Prozesses zugreifen?? Sonst ja iwie auch doof..
Danke.
-
DarkShadow44 schrieb:
sagt doch schon alles. Einfach dein C# Projekt auf x64 oder Any Cpu umstellen und es läuft ohne Probleme. Da ist doch kein hochkomplexer Umweg nötig ?
Diese Umstellung ist nicht immer klug oder erwünscht. Siehe unter anderem auch diesen Artikel:
http://blogs.msdn.com/b/rmbyers/archive/2009/06/8/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspxAbgesehen davon können, soweit mir bekannt ist, keine 32-Bit Module aus einem 64-Bit Prozess geladen werden. Also hast du danach das Gleiche Problem in die andere Richtung
Grüssli