CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pobieranie wyników działania skryptu *nixowego do Memo1

Pobieranie wyników działania skryptu *nixowego do Memo1

dział ogólny

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » piątek, 4 lutego 2011, 15:37

Jak najbardziej odpowiedziałem.

No nie odpowiedziałeś, bo mówimy o ls jako komendzie, a mnie interesowało jaki program odpalasz funkcją CreateProcess. Ale domyśliłem się w czym rzecz, co zresztą sam potwierdziłeś, pisząc '(...) jest to program do połączeń przez SSH'.

Zrób tak, jak napisałem, czyli wyślij na standardowe wejście komendę ls.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
nvdante
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 15:41

Spróbuj przekazać do lpFile lokalizację programu wraz z parametrami a do lpParameters wartość NULL, czyli:

KOD cpp:     UKRYJ  
ExecuteApplication("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"", NULL, this);


Napisz czy to rozwiązuje problem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 16:01

Cyfrowy Baron napisał(a):Napisz czy to rozwiązuje problem.


Niestety nie rozwiązuje, bo system potraktował nie tylko program1.exe, ale także całość czyli:
Kod: Zaznacz cały
c:\program1.exe login@ip hasło ./skrypt > dane1

jako jeden dłuuugi plik.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 16:13

Tak też podejrzewałem. W pomocy znalazłem taką informację odnośnie parametru lpParameters:


To include double quotation marks in lpParameters, enclose each mark in a pair of quotation marks, as in the following example.

KOD cpp:     UKRYJ  
sei.lpParameters = "An example: \"\"\"quoted text\"\"\"";



In this case, the application receives three parameters: An, example:, and "quoted text".



Nie wiem jak to rozumieć, gdyż to by znaczyło, że jeżeli chcę wstawić w parametrach cudzysłów to powinienem wstawiać trzy a nie jeden. czyli coś w tym rodzaju:

KOD cpp:     UKRYJ  
ExecuteApplication("C:\\program1.exe ", (Edit1->Text + "@ip -pw " + Edit2->Text + " \"\"\"./skrypt " + Edit5->Text + " > dane1\"\"\"").c_str(),  NULL);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 16:19

Spróbowałem, ale jedyne co się zmieniło to powielenie cudzysłowu, także w errorze, którzy się pojawia.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 16:24

Więc nie mam nuż pomysłów.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
nvdante
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 16:28

No to chyba jednak wrócę do sleepów z zastosowanie pętli oczekującej na FileExists.
Dam znać pewnie po weekendzie, jak poszło.
Dziękuję Wam bardzo za poświęcony czas.

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 16:45

Znalazłem w sieci informację, że lpParameters powinien być zakończony poprzez \0. Spróbuj więc tego:

KOD cpp:     UKRYJ  
ExecuteApplication("C:\\program1.exe ", (Edit1->Text + "@ip -pw " + Edit2->Text + " \"./skrypt " + Edit5->Text + " > dane1\"\0").c_str(),  NULL);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » piątek, 4 lutego 2011, 16:58

Niestety również nie, ale wymyśliłem małe co nieco.
Może by zrobić tak, żeby utworzyć pętlę, którą wcześniej zasugerowałeś, ale nie na FileExists tylko czy istnieje uruchomiony proces o konkretnej nazwie?
Taka pętla czekałaby do końca działania programu, a następnie zwróciła inną wartość i przeszła dalej.
Co myślisz o tym?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 17:06

Możesz tak spróbować, to rozwiązanie ma jednak tą wadę, że program musi cyklicznie sprawdzać, czy proces wciąż jest uruchomiony, czyli równie dobrze możesz sprawdzać, czy plik już istnieje.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » piątek, 4 lutego 2011, 17:47

Można to wszystko połączyć, czyli funkcję WinExec uruchamiającą plik z parametrami, z funkcją sprawdzającą czy proces został uruchomiony z funkcją WaitForSingleObject oczekującą na zamknięcie procesu:

KOD cpp:     UKRYJ  
#include <tlhelp32.h>

void ErrorExit(String lpFun)
{ /* funkcja obsługujaca błędy */
   LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;

    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
                (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(lpFun.t_str())+40)*sizeof(TCHAR));
    wsprintf((LPTSTR)lpDisplayBuf,
        TEXT("%s failed with error %d: %s"),
                lpFun, dw, lpMsgBuf);
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
        ExitProcess(dw);
}
//---------------------------------------------------------------------------
BOOL ProcessExists(String ProcesName, HANDLE &hProcess)
{ /* funkcja sprawdzająca czy proces istnieje */
 DWORD ExitCode;
 HANDLE Snap;
 PROCESSENTRY32 proces;

 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 proces.dwSize = sizeof(PROCESSENTRY32);

 if(Process32First(Snap, &proces))
 {
  do
  {
   if(proces.szExeFile[0] != '[')
   {
    if(SameText(proces.szExeFile, ProcesName))
    {
      TOKEN_PRIVILEGES tPriv;
      LUID luid;

      HANDLE hWndTok;
      if(!OpenProcessToken(GetCurrentProcess(),
         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hWndTok))
          { ErrorExit("OpenProcessToken: "); }

      if(!LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid ))
          { ErrorExit("LookupPrivilegeValue: "); }

      tPriv.PrivilegeCount = 1;
      tPriv.Privileges[0].Luid = luid;
      tPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

      if(!AdjustTokenPrivileges(hWndTok, false, &tPriv, sizeof(TOKEN_PRIVILEGES),
          (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL))
          { ErrorExit("AdjustTokenPrivileges: "); }


      hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);
      if(GetLastError() > 0) { ErrorExit("OpenProcess: "); }

     CloseHandle(Snap);
     return true;
    }
   }
  }while(Process32Next(Snap , &proces));
 }
 CloseHandle(Snap);
 return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);

 HANDLE hProcess;
 while(1) /* oczekiwanie na uruchomienie procesu */
 {
  if(ProcessExists("program1.exe", hProcess)) break;
 }

 WaitForSingleObject(hProcess, INFINITE);
 CloseHandle(hProcess);

 ShowMessage("Proces: program1.exe został zamknięty");
}


Nazwa pliku programu tutaj program1.exe musi być unikatowa by nie pokrywała się z innym procesem o tej samej nazwie pliku, w przeciwnym razie trzeba będzie jeszcze sprawdzać PID procesu.
Jeżeli będziesz miał problemy z funkcją ExitCode to ją pomiń i usuń wywołania tej funkcji w funkcji ProcessExist. Funkcja ExitCode została tutaj stworzona z myślą o środowisku C++Builder 2010, więc u Ciebie może nie działać prawidłowo, a nie chce mi się już tego przerabiać na char i AnsiString.Ta funkcja nie jest potrzebna do prawidłowego działania kodu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » poniedziałek, 7 lutego 2011, 13:30

W sumie dopiero zacząłem dostosowywać Twój kod do swoich potrzeb, ale faktycznie wygląda na to, że działa prawidłowo.
Udało się sprawdzić proces i po ubiciu wyświetlić komunikat, więc wywołanie innych procesów także powinno pójść gładko :-)
Dam znać jak skończę.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » poniedziałek, 7 lutego 2011, 14:20

Wszystko świetnie wyszło i działa teraz dokładnie tak, jak powinno :-)
Dziękuję za pomoc.
Poproszę jeszcze o podpowiedź w poniższej kwestii. Dane są przykładowe:
Nazwa: XXX
Tel: XXX
Strona: XXX

Chciałbym wyciągnąć 2 linijkę, ale tak, żeby zniknął napis "Tel:".
Póki co wypisuje linijkę poleceniem:
KOD cpp:     UKRYJ  
Edit3->Text = Memo1->Lines->Strings[2];


Do Edit, bo tak mi łatwiej :-)
Mogę jakoś to sformatować przyjmując, że ilość znaków na początku ( Tel: ) zawsze jest taka sama i chciałbym ją wyciąć, a na końcu może się zmieniać od 7 do nawet 15 znaków?

Oraz pytanie o poprzednie zagadnienie. Czy aby dodawać kolejne sprawdzanie procesów pod tym samym Button1 wystarczy zrobić tak:
KOD cpp:     UKRYJ  
 HANDLE hProcess1; // Zmieniłem wszędzie hProcess na hProcess1
 while(1)
 {
  if(ProcessExists("program2.exe", hProcess1)) break;
 }

 WaitForSingleObject(hProcess1, INFINITE);
 CloseHandle(hProcess1);
 


Pytam, bo działa prawidłowo, ale nie chciałbym, żeby powodowało jakieś błędy.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » poniedziałek, 7 lutego 2011, 14:48

Chciałbym wyciągnąć 2 linijkę, ale tak, żeby zniknął napis "Tel:".


Jeżeli liczba znaków do wycięcia jest znana to można tak:

KOD cpp:     UKRYJ  
Edit3->Text = Memo1->Lines->Strings[2].SubString(4, 100).Trim();


Jeżeli jednak chcesz np. wyciąć wszystko co jest na początku przed dwukropkiem to nie musisz znać długości tekstu do wycięcia, wystarczy wskazać od którego miejsca ma być wycięte:

KOD cpp:     UKRYJ  
 String mText = Memo1->Lines->Strings[2];
int p = mText.Pos(":");
Edit3->Text = mText.SubString(p + 1, mText.Length()).Trim();


Funkcja Pos(String text) zwraca pozycję pojedynczego znaku podanego jako argument w łańcuchu znaków.
Funkcja Trim() obcina spacje na początku i końcu łańcucha znaków.



Oraz pytanie o poprzednie zagadnienie. Czy aby dodawać kolejne sprawdzanie procesów pod tym samym Button1 wystarczy zrobić tak:


Wystarczy tak, a uchwyt HANDLE też może być jeden, nie musisz tworzyć dla każdego wywołania nowego uchwytu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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 XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » poniedziałek, 7 lutego 2011, 14:59

Rewelacja z tym przycinaniem, dokładnie to potrzebowałem ;-)
A co do ponownego uchwytu to jesteś pewny? Bo jak deklaruje pod jednym Button1 to dostaję info:
Kod: Zaznacz cały
[C++ Error] Unit1.cpp(124): E2238 Multiple declaration for 'hProcess'
[C++ Error] Unit1.cpp(105): E2344 Earlier declaration of 'hProcess'

Ogólnie będę musiał go wykorzystać jakieś 10 razy, dlatego pytam o to.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

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 9 gości

cron