Process.Start () возвращает null для собственного процесса - PullRequest
0 голосов
/ 18 октября 2010

Я использую Process.Start () для инициализации копии с повышенными правами запущенного в данный момент приложения. К сожалению, Process.Start () возвращает null, потому что считает, что использует существующий процесс моего приложения, и, хотя процесс уже существует, он не определяет какой-либо способ обработки точки входа такого типа.

Есть ли какой-либо способ в .NET (с помощью конфигурации или иным образом), чтобы я мог сказать системе не использовать существующие копии моего процесса? Эта проблема возникает только в Windows XP, а не в Vista или 7.

Копия кода ниже:

internal static bool EnsureAssociation()
{
    // Check to make sure RoketPack is associated.
    if (!Protocol.IsAssociated())
    {
        ProcessStartInfo info = new ProcessStartInfo();
        info.FileName = UNC.UniversalApplicationPath;
        info.UseShellExecute = true;
        if (!UAC.IsAdmin())
            info.Verb = "runas"; // Provides Run as Administrator
        info.Arguments = "--associate";
        Process proc = null;
        try
        {
            proc = Process.Start(info);
        }
        catch (Win32Exception)
        {
            Errors.Raise(Errors.ErrorType.ERROR_CAN_NOT_ASSOCIATE_PROTOCOL);
            return false;
        }

        if (null != proc)
        {
            // Wait until the association is complete.
            proc.WaitForExit();
            return Protocol.IsAssociated();
        }
        else
        {
            Errors.Raise(Errors.ErrorType.ERROR_CAN_NOT_ASSOCIATE_PROTOCOL);
            return false;
        }
    }
    else
        return true;
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2010

То, что вы хотите сделать, это поведение по умолчанию, т. Е. Любая программа может запускать несколько экземпляров.Для предотвращения запуска приложения более одного раза потребуется дополнительный код.

Просмотр Отражатель на Process.Start()

public static Process Start(ProcessStartInfo startInfo)
{
    Process process = new Process();
    if (startInfo == null)
    {
        throw new ArgumentNullException("startInfo");
    }
    process.StartInfo = startInfo;
    if (process.Start())
    {
        return process;
    }
    return null;
}

Вы можете отслеживать, куда возвращается null,Он вернет null, если процесс не запустится внутри process.Start().

public bool Start()
{
    this.Close();
    ProcessStartInfo startInfo = this.StartInfo;
    if (startInfo.FileName.Length == 0)
    {
        throw new InvalidOperationException(SR.GetString("FileNameMissing"));
    }
    if (startInfo.UseShellExecute)
    {
        return this.StartWithShellExecuteEx(startInfo);
    }
    return this.StartWithCreateProcess(startInfo);
}

...

Вы поняли идею.Продолжайте отслеживать, почему вы получаете значение null.Если у вас нет копии Reflector , GET IT NOW!

NB: Приносим извинения, что это не дает точных решение вашей проблемы, однако это показывает, что вы можете найти его самостоятельно.:)

HTH,

0 голосов
/ 18 октября 2010

Я решил эту проблему, проверив, является ли UAC.IsAdmin () истинным, и если это так, просто выполните действия, которые выполнил бы повышенный процесс.

Это напрямую не решает проблемуProcess.Start () возвращает null, но я думаю, что ситуация повторного использования вызвана тем, что процесс, который был бы запущен, идентичен во всех отношениях (где, как если бы процесс запускался с повышением через глагол 'runas', этосчитается другим и не возвращает ноль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...