Как получить процесс, который был порожден "open with" после shellexec - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь очистить временный файл, который я запустил, с помощью простого Process.Start ().Я не знаю, какой будет тип файла, поэтому я запускаю его, используя ShellExec = true:

var lProcess = new Process();
lProcess.StartInfo.FileName = lTempFileName;
lProcess.EnableRaisingEvents = true;
lProcess.Start();

TempFileCleaner.RegisterCleanup(lProcess, lTempFileName);

Однако процесс разрешается как "C: \ Windows \ SysWOW64 \ rundll32.exe "(который на самом деле является диалогом Open With).Как только вы выберете приложение в диалоге с открытым, процесс завершится.

Есть ли способ узнать, какой процесс запущен rudll32 до того, как он существует?

Если это невозможно, мне придется читать ассоциации файлов вручную иЗапустите правильный процесс самостоятельно, но мне придется отображать ошибку, если я не могу найти никаких ассоциаций.

Я также написал этот класс, чтобы помочь с очисткой:

    private static class TempFileCleaner
    {
        static Dictionary<Process, string> _PendingCleanups = new Dictionary<Process, string>();

        public static void RegisterCleanup(Process pProcess, string pFileName)
        {
            _PendingCleanups.Add(pProcess, pFileName);

            pProcess.Exited += pProcess_Exited;
        }

        static void pProcess_Exited(object sender, EventArgs e)
        {
            var lProcess = (Process)sender;
            lProcess.Exited -= pProcess_Exited;

            try
            {
                File.Delete(_PendingCleanups[lProcess]);
            }
            finally
            {
                _PendingCleanups.Remove(lProcess);
                lProcess.Dispose();
            }
        }
    }
...