CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Otwieranie programu w innym programie

Otwieranie programu w innym programie

dział ogólny

Otwieranie programu w innym programie

Nowy postprzez Arkoarek » poniedziałek, 15 grudnia 2014, 18:55

Witam. Napisałem programik w którym otwiera się inny program klikając w przycisk.
Przycisk zawiera funkcję :

WinExec("Notatki.exe", SW_SHOW);

Program się otwiera ale plik "notki.rtf", który miał się wgrać do niego, nie pojawia się. Gdy osobno włączam ten program to plik się wgrywa.
Proszę o podpowiedź. Dzięki
Avatar użytkownika
Arkoarek
Bladawiec
Bladawiec
 
Posty: 21
Dołączył(a): środa, 16 października 2013, 14:51
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: Borland C++Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Otwieranie programu w innym programie

Nowy postprzez polymorphism » poniedziałek, 15 grudnia 2014, 20:52

WinExec to anachronizm, użyj CreateProcess lub ShellExecute.

Program się otwiera ale plik "notki.rtf", który miał się wgrać do niego, nie pojawia się

A skąd Notatki.exe wie, że musi notki.rtf wczytać?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Otwieranie programu w innym programie

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2014, 05:46

KOD cpp:     UKRYJ  
{
  char katalog [MAX_PATH];

    GetWindowsDirectory(katalog, MAX_PATH);

    String Notes = AnsiString(katalog) + "\\notepad.exe";
    Notes = Notes + " " + "c:\\notki.rtf";

    STARTUPINFO StartupInfo;
    ;ZeroMemory( &StartupInfo, sizeof(STARTUPINFO));
    StartupInfo.cb = sizeof(STARTUPINFO);

    PROCESS_INFORMATION ProcessInfo;

    if(CreateProcess(NULL,
        Notes.c_str(),
        NULL,
        NULL,
        TRUE,
        NORMAL_PRIORITY_CLASS,
        NULL,
        NULL,
        &StartupInfo,
        &ProcessInfo))
    {
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    }
}


Notatnik nie obsługuje formatu rtf. W przykładzie przyjąłem, że plik notki.rtf znajduje się na dysku C. Program się nie domyśli, gdzie znajduje się Notepad ani gdzie znajduje się plik, który ma otworzyć.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Otwieranie programu w innym programie

Nowy postprzez polymorphism » wtorek, 16 grudnia 2014, 11:09

Notatnik nie obsługuje formatu rtf.

Nie notepad.exe, tylko Notatki.exe.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Arkoarek
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Otwieranie programu w innym programie

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2014, 18:02

Czyli jakiś jego własny program - umknęło mi to. Żeby taki program otwierał pliki z linii komend to trzeba jeszcze w nim zaprogramować odpowiedni mechanizm.

http://programowanie.cal.pl/cyfbar/api5.html#api6

Jeżeli program Notatki.exe znajduje się w tym samym katalogu co program, który go uruchamia, to ścieżkę dostępu do takiego katalogu można uzyskać za pomocą funkcją Application->ExeName i wtedy kod powinien wyglądać tak:

KOD cpp:     UKRYJ  
    String Notes = ExtractFilePath( Application->ExeName ) + "notepad.exe";
    Notes = Notes + " " + "c:\\notki.rtf";

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Arkoarek
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Otwieranie programu w innym programie

Nowy postprzez Arkoarek » wtorek, 16 grudnia 2014, 19:35

Dobrze, że nie od razu odpisałem na podane przykłady bo bym zarzucił was niepotrzebną treścią. A tak sprawdziłem "10 razy" i zadziałało :) Fajnie bo robię taki mini pulpit dla moich programów. Jeszcze tylko o jedno bym zapytał. Co zrobić, żeby ponowne kliknięcie w przycisk, który otwiera notatnik nie otwierało drugiego notatniku?
Avatar użytkownika
Arkoarek
Bladawiec
Bladawiec
 
Posty: 21
Dołączył(a): środa, 16 października 2013, 14:51
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: Borland C++Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Otwieranie programu w innym programie

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2014, 22:20

Gdybyś zajrzał do linka, który ci podałem wcześniej, to byś o to nie pytał.

http://programowanie.cal.pl/cyfbar/api5.html#api6
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Otwieranie programu w innym programie

Nowy postprzez Arkoarek » czwartek, 18 grudnia 2014, 19:55

Tylko, że jednak chodziło mi o coś innego. Źle zacząłem cały wątek:
Napisałem programik w którym otwiera się inny program klikając w przycisk.


a powinienem napisać: Napisałem program ("Pulpit") w którym znajdują się przyciski otwierające inne programy.
Gdy te programy włączam osobno wszystko działa dobrze. Jeśli zaś uruchomię je klikając na przycisk w programie "Pulpit" co prawda się włączą, ale nie można już otworzyć innych plików powiązanych z nimi, albo się do tych programów nie wgrają.

Sorki za to.
Avatar użytkownika
Arkoarek
Bladawiec
Bladawiec
 
Posty: 21
Dołączył(a): środa, 16 października 2013, 14:51
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: Borland C++Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Otwieranie programu w innym programie

Nowy postprzez Cyfrowy Baron » czwartek, 18 grudnia 2014, 21:19

Jeżeli chcesz, żeby twój program wczytywał pliki z linii komend to musisz w tym twoim programie umieścić odpowiedni mechanizm, który będzie te pliki wczytywał. Jeżeli w tym programie takowego mechanizmu nie będzie to mimo iż przekażesz mu poprzez linię komend jakiś plik, to on i tak go nie wczyta. W linku, który ci podałem jest taki mechanizm. Są tam w zasadzie dwa mechanizmy - jeden wczytujący pliki z linii komend i drugi sprawiający, że po przekazaniu do programu z linii komend polecenia wczytania kolejnego pliku nie zostanie otwarte nowa kopia programu, lecz wczyta się w tym samym programie.



Arkoarek napisał(a):Jeśli zaś uruchomię je klikając na przycisk w programie "Pulpit" co prawda się włączą, ale nie można już otworzyć innych plików powiązanych z nimi, albo się do tych programów nie wgrają.


Ponieważ klikając na przycisk w programie Pulpit musisz przekazać jaki plik ma się w tym programie otworzyć funkcją, którą ci pokazałem. Tworzyłem swego czasu coś podobnego, takie dodatkowe menu, w którym klikając na program na liście otwierał się ten program i ewentualnie otwierał plik przekazany z linii komend. To działa, więc nie rozumiem z czym masz problem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Otwieranie programu w innym programie

Nowy postprzez Arkoarek » sobota, 20 grudnia 2014, 22:15

Użyłem jednak tego kodu :
Kod: Zaznacz cały
  WinExec("Notatki.exe", SW_SHOW); 
do otwierania programów.

Sam program w ten sposób otwierany musiałem zmienić, żeby później mógł otwierać inne pliki.
Oto kod otwieranego programiku, w którym jest przycisk BitBtn2 odświeżający wgrywany plik "Notki ang.rtf" :

Kod: Zaznacz cały
TForm1 *Form1;

String scieszka;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{ }
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  scieszka = ExtractFilePath( ParamStr( 0 ) );

  String sFileName = "\\Notatki\\Notki ang.rtf";

   if (FileExists( scieszka + sFileName ))
    {
      RichEdit1->Lines->LoadFromFile( scieszka + sFileName );
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
   String sFileName = "\\Notatki\\Notki ang.rtf";

   if (FileExists( scieszka + sFileName ))
    {
      RichEdit1->Lines->LoadFromFile( scieszka + sFileName );
    }
}
//--------------------------------------------------------------------------- 


Wielkie dzięki 8-)
Avatar użytkownika
Arkoarek
Bladawiec
Bladawiec
 
Posty: 21
Dołączył(a): środa, 16 października 2013, 14:51
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: Borland C++Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Otwieranie programu w innym programie

Nowy postprzez Cyfrowy Baron » sobota, 20 grudnia 2014, 22:47

WinExec to przestarzała funkcja, nie powinieneś jej używać bo w nowszych systemach może nie zadziałać. Przecież mogłeś tworzyć funkcję:

KOD cpp:     UKRYJ  
void ExecuteApp(String sFileName)
{
    STARTUPINFO StartupInfo;
    ;ZeroMemory( &StartupInfo, sizeof(STARTUPINFO));
    StartupInfo.cb = sizeof(STARTUPINFO);

    PROCESS_INFORMATION ProcessInfo;

    if(CreateProcess(NULL,
        sFileName.c_str(), // tutaj następuje uruchomienie proramu przekazanego funkcji:
        NULL,
        NULL,
        TRUE,
        NORMAL_PRIORITY_CLASS,
        NULL,
        NULL,
        &StartupInfo,
        &ProcessInfo))
    {
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    }
}
//------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ExecuteApp( "ścieżka dostepu do programu\\nazwa programu.exe" );
}




Arkoarek napisał(a):Użyłem jednak tego kodu :

Kod: Zaznacz cały
      WinExec("Notatki.exe", SW_SHOW); 


do otwierania programów.


Tutaj jest jednak problem, przekazałeś funkcji tylko nazwę programu, więc program może zgubić ścieżkę dostępu do tego programu. Skoro program Notatki.exe jest w tym samym katalogu co program, który go uruchamia, to powinieneś zrobić to samo co zrobiłeś w tym programie Notatki, czyli:

KOD cpp:     UKRYJ  
 WinExec( ExgtractFilePath( ParamStr( 0 )  ) + "\\Notatki.exe", SW_SHOW);


lub:

KOD cpp:     UKRYJ  
 WinExec( ExgtractFilePath( Application->ExeName  ) + "\\Notatki.exe", SW_SHOW);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 28 gości

cron