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, 11:33

Kończy działanie, ale nie zawsze w tym samym momencie, bo to zależy od ilości koniecznych działań.

No to tylko CreateProcess + WaitForSingleObject, żadne inne prowizorki.
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 XPFirefox

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

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

Ok, a więc biorę się za to, ale mam jeszcze kilka pytań:

1. ExecuteApplication? Cóż to jest i gdzie to wstawić? Miałem nadzieję, że to Event okna, ale nie. Mam po prostu wkleić ten kod?
Kod: Zaznacz cały
void __fastcall ExecuteApplication(AnsiString  FileName,  char param[], HWND h)
{
SHELLEXECUTEINFO sei;
memset(&sei, 0, sizeof (sei));
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = h;
sei.lpVerb = "open";
sei.lpFile = FileName.c_str();
sei.lpParameters = param;
sei.nShow = SW_SHOWDEFAULT;

if(ShellExecuteEx(&sei))
  try
  {
   WaitForSingleObject(sei.hProcess, INFINITE);
  }
  __finally
{
  CloseHandle(sei.hProcess);
}
}


2. Co daje winini w tej funkcji?
Kod: Zaznacz cały
#include <stdio.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ExecuteApplication("c:\\program.exe", winini, this);
}


Przepraszam za poziom tych pytań, ale jest to dla mnie w pewnym sensie nowość, żeby dostosowywać czyjeś do swojego aż w takim stopniu ;-)
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, 12:19

Funkcja ExecuteApplication oczekuje jako pierwszego argumentu lokalizacji programu, który ma być uruchomiony. Jak drugi argument podajesz parametry z jakimi ten program ma być uruchomiony, jako trzeci argument uchwyt do okna programu z którego funkcja jest wywoływana, można this, albo po prostu NULL, czyli coś w tym stylu:

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


Działanie aplikacji zostanie wstrzymana na tak długo jak długo będzie istniał proces program1.exe, czyli jak długo będzie uruchomiony.
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 XPFirefox

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

Nowy postprzez polymorphism » piątek, 4 lutego 2011, 12:27

Parę uwag.

Kod wklejaj w znaczniki 'CPP', bo się niewygodnie czyta.

Zmień tego dziwoląga:
KOD cpp:     UKRYJ  
if(ShellExecuteEx(&sei))
try
{
        WaitForSingleObject(sei.hProcess, INFINITE);
}
__finally
{
        CloseHandle(sei.hProcess);
}

na
KOD cpp:     UKRYJ  
if(ShellExecuteEx(&sei))
{
        WaitForSingleObject(sei.hProcess, INFINITE);
        CloseHandle(sei.hProcess);
}
 


Tak się zastanawiam, czy nie prościej byłoby, gdybyś pisać to w Javie, bo z tego, co widzę, C/C++ nie znasz za dobrze.
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 12:35

Javy też nie znam, więc wolę zostać przy tym, z czym chociaż trochę sobie radzę - skrypty napisałem sobie w bashu i na tym polu daje sobie radę, c++ używam z potrzeby.

Podmieniłem, ale w obu przypadkach jest dziwny efekt, otóż:
KOD cpp:     UKRYJ  
ExecuteApplication("C:\\program.exe", ( Edit1->Text + "@ip -pw " + Edit2->Text + "  \"./skrypt " + Edit5->Text + " > dane\"").c_str(), this);
 

Powyższe polecenie nie jest w stanie wygenerować pliku o nazwie dane.
Wywoływane poprzednią komendą tworzy plik prawidłowo.
Dzieje się tak dlatego, że polecenie uruchamia program.exe, ale bez opcji. Sprawdziłem na dwóch przykładach i na pewno właśnie to jest problemem. Jakiś pomysł?
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 polymorphism » piątek, 4 lutego 2011, 12:55

Zapewne chodzi o to przekierowanie. W tym wątku był podobny problem -> link.
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 13:17

KOD cpp:     UKRYJ  
SECURITY_ATTRIBUTES sa;
sa.nLength              =   sizeof  (   SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor =   NULL;
sa.bInheritHandle       =   TRUE;

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

si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;

/* wejście */
si.hStdInput = CreateFile("C:\\test.txt", // <-- to chyba mogę wykasować, ponieważ nie ma żadnego wejścia
                    GENERIC_READ,
                    FILE_SHARE_READ,
                    &sa,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);

/* wyjście */
si.hStdOutput = CreateFile("C:\\out.txt",
                    GENERIC_WRITE,
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
                    &sa,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);

PROCESS_INFORMATION ProcessInfo;

if(CreateProcess(NULL, "C:\\program login@ip -pw haslo \"ls\"", // <-- to już się nie udaje, ponieważ w pliku out.txt nie ma wyniku polecenia ls.
                        NULL,
                        NULL,
                        TRUE,
                        NORMAL_PRIORITY_CLASS,
                        NULL,
                        NULL,
                        &si,
                        &ProcessInfo))
{
 WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
 CloseHandle(ProcessInfo.hProcess);
 CloseHandle(ProcessInfo.hThread);
}

CloseHandle(si.hStdInput);
CloseHandle(si.hStdOutput);
 


Zrobiłem gdzieś błąd, z powodu którego nie wyświetla się to co zaznaczyłem?
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 polymorphism » piątek, 4 lutego 2011, 13:51

KOD cpp:     UKRYJ  
// <-- to chyba mogę wykasować, ponieważ nie ma żadnego wejścia

Tak, tylko ustaw uchwyt na NULL.

KOD cpp:     UKRYJ  
// <-- to już się nie udaje, ponieważ w pliku out.txt nie ma wyniku polecenia ls.

A program w ogóle się odpala?
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 14:00

Odcięcie końcówki ls czyli pozostawienie samego logowania wypisuje w pliku out.txt:
Kod: Zaznacz cały
Last login: Fri Feb  4 12:19:12 2011 from host

Czyli teoretycznie działa, ale bez dodatkowego parametru.
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 polymorphism » piątek, 4 lutego 2011, 14:04

A to ls musi być w cudzysłowach?
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 14:05

Dla tak prosto złożonego polecenie nie - docelowo raczej tak, ale tak czy inaczej to z "" czy bez, nie udaje mi się przechwycić wyniku komendy.
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 polymorphism » piątek, 4 lutego 2011, 14:59

A czy komenda ls nie powinna być poprzedzona myślnikiem, czyli -ls?

Co to w ogóle za program?
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 15:03

Nie, nie powinna :-)
ls to odpowiednik Windowsowego dir czyli listowanie plików w danej ścieżce.

Dodam jeszcze, że to nie problem z poleceniem ls, bo inny program wykorzystuje inne polecenia i także nie działa, a te już nie są wywoływane po stronie serwera tylko lokalnie. Wygląda na to, że po prostu to polecenie nie wywołuje się z parametrami, chociaż logowania przez parametry przechodzi.
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 polymorphism » piątek, 4 lutego 2011, 15:10

Nie odpowiedziałeś mi na pytanie, jaki to program. Ale chyba wiem, o co chodzi. Czy aby na pewno ta komenda jest komendą linii poleceń tego programu? Bo coś mi się wydaje, że powinna ona zostać wysłana na standardowe wejście...
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 XPFirefox

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

Nowy postprzez nvdante » piątek, 4 lutego 2011, 15:17

Jak najbardziej odpowiedziałem.
Tak samo, jak w Windowsie wchodzisz do cmd i wpisujesz dir, tak w systemach *nixowych po prostu piszesz ls. http://pl.wikipedia.org/wiki/Ls_%28Unix%29
Sama komenda nie jest częścią programu, ale jest to program do połączeń przez SSH, czyli wykorzystujesz takie komendy, jakie ma zdalny serwer.

Aby wykluczyć problem z samym poleceniem zrobiłem też tak (obciąłem kod, bo w pozostałych miejscach nic nie zmieniałem ):
KOD cpp:     UKRYJ  
        si.hStdOutput = CreateFile("C:\\out.txt",
                    GENERIC_WRITE,
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
                    &sa,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);

        PROCESS_INFORMATION ProcessInfo;

        if(CreateProcess(NULL, "C:\\inny_program.exe login:hasło@ip /console /command \"get dane c:\\\" \"exit\"",
                        NULL,
                        NULL,
                        TRUE,
                        NORMAL_PRIORITY_CLASS,
                        NULL,
                        NULL,
                        &si,
                        &ProcessInfo))

Ten program ma za zadanie pobranie pliku przy pomocy konsoli.
Nic takiego się nie dzieje. Tworzy się plik out.txt, ale pusty oraz polecenie "get dane c:\\" nie zapisuje żadnego pliku na dysku.
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 8 gości

cron