Uruchomienie zewnętrznego programu

0

Cześć wszystkim!
Próbuję uruchomić zewnętrzny program za pomocą poniższego kodu. Wciśnięcie jednak button1 nie powoduje jednak żadnej reakcji w systemie. Program można uruchomić bez problemu osobno. Co jest nie-tak?

string programPath = "C:\\CameraApp\\W.exe";

public static void RunProgram(string programPath)
{
    try
    {
        if (File.Exists(programPath))
        {
            // Utwórz nowy proces
            Process process = new Process();

            // Ustaw właściwości procesu
            process.StartInfo.FileName = programPath;
            process.StartInfo.UseShellExecute = true;
            process.StartInfo.CreateNoWindow = false;

            // Uruchom program
            process.Start();
        }
        else
        {
            throw new FileNotFoundException("Nie znaleziono pliku programu.", programPath);
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Błąd podczas uruchamiania programu.", ex);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        RunProgram(programPath);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Wystąpił błąd podczas uruchamiania programu: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
0

Może w tym przypadku potrzebujesz tej super funkcji "bezpieczeństwa" Windows jaką jest Uruchom jako administrator 🤔

0
AdamWox napisał(a):

Może w tym przypadku potrzebujesz tej super funkcji "bezpieczeństwa" Windows jaką jest Uruchom jako administrator 🤔

Chyba nie...

private void button1_Click(object sender, EventArgs e)
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = programPath,
        Verb = "runas",
    };

    try
    {
        Process.Start(startInfo);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Wystąpił błąd podczas uruchamiania programu: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

...nie działa.

0

Nie ten CameraApp\\W.exe, a ten, który uruchamia ten W.exe. Jeśli sprawdzasz to na debugu, to musisz Visual Studio uruchomić z admina.

0

A spróbuj dopisać

process.StartInfo.WorkingDirectory = Path.GetDirectoryName(programPath);
0

Oto cały (zmieniony) kod:

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Forms;

namespace WindowsRunSystemProgram
{
    public partial class Form1 : Form
    {
        string programPath = $"C:\\CameraApp\\W.exe";

        public Form1()
        {
            InitializeComponent();
        }


        public static void RunProgram(string programPath)
        {
            try
            {
                // Utwórz nowy proces
                Process process = new Process();

                // Ustaw właściwości procesu
                process.StartInfo.FileName = programPath;
                process.StartInfo.UseShellExecute = true;
                process.StartInfo.CreateNoWindow = false;


                // Uruchom program
                process.Start();
            }
            catch (Exception ex)
            {
                // Wyświetl komunikat o błędzie
                MessageBox.Show("Wystąpił błąd podczas uruchamiania programu: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = programPath,
                Verb = "runas", // To uruchomi program jako administrator
            };

            try
            {
                Process.Start(startInfo);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Wystąpił błąd podczas uruchamiania programu: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
    }
}
0

...ale aplikacja w.exe uruchomiona w ten sposób - działa:

static void DelayedStartApplication(string appname, int delaymilliseconds)
{
    try
    {
        Thread.Sleep(delaymilliseconds);

        string currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
        string appPath = Path.Combine(currentDirectory, appname);

        if (File.Exists(appPath))
        {
            Process.Start(appPath);
            MessageBox.Show("Uruchomiono aplikację " + appname + " po opóźnieniu.");
        }
        else
        {
            MessageBox.Show("Nie znaleziono aplikacji " + appname + " w lokalizacji " + currentDirectory + ".", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Błąd podczas uruchamiania aplikacji " + appname + " : " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
1

Czyli miałem rację, że uprawnienia, bo AppDomain.CurrentDomain.BaseDirectory - oznacza ścieżkę twojej aplikacji, a twoja aplikacja w "swoim" folderze może "wszystko". Skopiuj wszystko z C:\\CameraApp do folderu, w którym jest twoje .exe i zmień

process.StartInfo.FileName = programPath;

na

process.StartInfo.FileName = "W.exe";

Jeśli się uruchomi to znaczy, że twoja aplikacja nie ma uprawnień, aby uruchomić to samo w "C:\\CameraApp\\W.exe";

1 użytkowników online, w tym zalogowanych: 0, gości: 1