Uruchomienie zewnętrznego programu

Uruchomienie zewnętrznego programu
Neosphoros
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:147
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?

Kopiuj
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);
    }
}
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

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

Neosphoros
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:147
0
AdamWox napisał(a):

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

Chyba nie...

Kopiuj
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.

edytowany 1x, ostatnio: Neosphoros
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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.

Neosphoros
uruchamiam główny program z uprawnieniami administratora i... nic. poza tym jestem na koncie z uprawnieniami administratora więc uruchamianie programu jako administrator nie powinno być chyba konieczne.
AdamWox
To Windows, w tym systemie dużo rzeczy "nie powinno" się robić, a jednak działa jak je się zrobi.
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

A spróbuj dopisać

Kopiuj
process.StartInfo.WorkingDirectory = Path.GetDirectoryName(programPath);
Zobacz pozostałe 3 komentarze
AdamWox
Poddaje się 😅
Neosphoros
...a może to w.exe musi spełniać jakieś warunki w systemie aby mógł być uruchomiony w taki sposób?
AdamWox
nie mam pojęcia co to za apka i co robi, oprócz tego, że folder nazywa się CameraApp. Ciężko cokolwiek stwierdzić nie mając z tym "fizycznie" do czynienia
Neosphoros
aplikacja wyświetla podgląd z kamery
AdamWox
Jakiej kamery? Z laptopa/komputera, czy jakaś zewnętrzna poza komputerem? Jeśli to zwykły, tak zwany webcam i masz Windows 10 albo 11 to wystarczy Process.Start("microsoft.windows.camera:");
Neosphoros
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:147
0

Oto cały (zmieniony) kod:

Kopiuj
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);
            }

        }
    }
}
Neosphoros
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:147
0

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

Kopiuj
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);
    }
}
edytowany 1x, ostatnio: Neosphoros
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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ń

Kopiuj
process.StartInfo.FileName = programPath;

na

Kopiuj
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";

edytowany 1x, ostatnio: AdamWox
Neosphoros
Zgadza się. Dziękuję. Nie ma sposobu aby uruchomić aplikację znajdującą się w innym folderze?
AdamWox
Pewnie jest, ale to musisz poczekać na kogoś mądrzejszego, albo Google ✌
ŁF
Nie ma sposobu aby uruchomić aplikację znajdującą się w innym folderze - jest. Po pierwsze musisz mieć uprawnienia do wykonania pliku z tego "innego folderu", po drugie ścieżka do pliku musi być prawidłowa, najprostsza będzie ścieżka absolutna.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.