Program konsolowy - wysylanie i pobieranie danych

2013-09-30 12:13

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Mam program, który odpala się w konsoli. Potrzebuje co jakiś czas przesyłać do niego dane i odbierać.
Google nie chce mi poóc ;(
Jak to zrobić ?

Pozostało 580 znaków

2013-09-30 12:57

Rejestracja: 7 lat temu

Ostatnio: 27 minut temu

0

a to wredne google... Popatrz mi natomiast na samej górze zwróciło https://www.google.pl/search?q=delphi+cmd+output o ale w sumie ja nie wpisywałem w google zapytania typu jak szydełkować...


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2013-09-30 13:12

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

0
function RunIt(const Exe,Param,Dir:String):Boolean;
var SA:TSecurityAttributes;
var SI:TStartupInfo;
var PI:TProcessInformation;
var Res:Cardinal;
var InH,OutH,ErrH,MyInH,MyOutH,MyErrH:THandle;
var L:DWord;
var F:Boolean;
var S:String;
var MSG:PChar;
const PipeSize=16000;
begin
  SA.nLength:=sizeof(SA);
  SA.bInheritHandle:=true;
  SA.lpSecurityDescriptor:=nil;
  CreatePipe(InH,MyInH,@SA,PipeSize);
  CreatePipe(MyOutH,OutH,@SA,PipeSize);
  CreatePipe(MyErrH,ErrH,@SA,PipeSize);
  try
    FillChar(SI,SizeOf(SI),0);
    FillChar(PI,SizeOf(PI),0);
    SI.cb:=SizeOf(SI);
    SI.wShowWindow:=SW_HIDE;
    SI.hStdInput:=InH;
    SI.hStdOutput:=OutH;
    SI.hStdError:=ErrH;
    SI.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    F:=CreateProcess
    (
      nil,
      PChar(Exe+' '+Param),
      nil,
      nil,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      PChar(Dir),
      SI,
      PI
    );
    if F then
    begin
      // Write to InH pipe
      WaitforSingleObject(PI.hProcess,INFINITE);
      GetExitCodeProcess(PI.hProcess,Res);
      Result:=(Res=0);
      if Result then
      begin
        SetLength(S,PipeSize);
        L:=0;
        ReadFile(MyOutH,S[1],PipeSize,L,nil);
        SetLength(S,L);
        // S - result 
      end;
      Exit;
    end;
    Res:=GetLastError;
    // Some message there
    Result:=false;
  finally
    CloseHandle(InH);
    CloseHandle(OutH);
    CloseHandle(ErrH);
    CloseHandle(MyInH);
    CloseHandle(MyOutH);
    CloseHandle(MyErrH);
  end;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-09-30 13:50

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Bardzo dziękuję. Jeszcze nie testowałem. Ale to chyba nie poleci. Problem jest taki, że program w konsoli odpalam 1x i dopiero po pewnym czasie mogę przesłać parametry. Program musi znaleźć interface na USB. Dopiero po tym czasie mogę wysłać parametry.

zaraz osiwieje.
Dlaczego CreateProcess nie odpala mi programu, a ShellExecute to robi ?

RunIt('moj.exe','',ExtractFilePath(Application.ExeName));

ShellExecute(Handle, 'open', 'moj.exe', nil, pchar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL);

dodanie znaczników <code class="delphi"> i ``- fp

edytowany 4x, ostatnio: furious programming, 2013-10-01 13:10
Bezpośrednie w takiej postaci - nie, ale już wiesz jak. - _13th_Dragon 2013-09-30 13:55

Pozostało 580 znaków

2013-09-30 22:06

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Wiem ze nie pisze sie postow pod postami, ale moze tak ktos mi podpowie.
Nie jestem programista z wykształcenia ale z potrzeby. Programow nie potrafie pisac tak jak Wy, ale "bazgroły" wystarcza na moje potrzeby.

Zmieniłem to:

SI.wShowWindow:=SW_NORMAL;

i teraz juz sie okienko z programem pokazuje ale program sie wiesza.

......" System dodaje znak 0 do linii poleceń, aby oddzielić nazwę plików od argumentów jego wywołania. "

Chyba dlatego

dodanie znacznika <code class="delphi"> - fp

edytowany 2x, ostatnio: furious programming, 2013-10-01 13:10
Musisz coś wpisać do pipe InH. - _13th_Dragon 2013-10-01 07:40

Pozostało 580 znaków

2013-10-01 10:30

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Jezeli zrobie cos takiego

RunIt('cmd.exe','help',ExtractFilePath(Application.ExeName));

To pojawia mi sie tylko czarne okienko z migajacym kursorem ( cmd mam skopiowany tam gdzie kod wynikowy mojego programu ) i w niebieskim pasku ( na gorze ramki ) sciezka dostepu do cmd.exe
I tyle , zamiast zgloszenia sie programu ( napis microsoft .....) .
Nie mam pojecia jak i gdzie co wpisac.
Czytalem rozne fora ( nawet zagraniczne ) i cos mi dalej to nie robi.

Czytalem ze shellexecute nie ma uchwytu do okna czyli z tego co rozumiem nie nadaje sie to do mojego celu.
jest/bylo shellexecuteEX ale tego juz chyba nie ma.

Jak w pierwszym kroku otworzyc tylko cmd bez parametrow ?
jak w drugim kroku i kolejnych ( petli ) wysylac znaki ( ciagi ) do cmd ?

dodanie znacznika <code class="delphi"> - fp

edytowany 1x, ostatnio: furious programming, 2013-10-01 13:11
Przypominam o wstawianiu kodu w znaczniki kolorujące składnię - następne posty z bezpośrednio wklejonym kodem będą usuwane; - furious programming 2013-10-01 13:11

Pozostało 580 znaków

2013-10-01 11:48

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Nikt nie pomoże ?

Pozostało 580 znaków

2013-10-01 13:15

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

0

Przecież napisałem w komentarzu "Musisz coś wpisać do pipe InH." - którego słowa nie rozumiesz?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-10-01 21:48

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

To ze mam wpisac to wiem. Tylko nie wiem jak sie cos wpisuje do pipe InH.

Chyba szybciej i prosciej jak znajde jakiegos studenta.

Nie pisz kilku swoich postów jeden pod drugim, tylko edytuj istniejący i do niego dopsuj nowe informacje; - furious programming 2013-10-01 22:43
A ten wiersz widzisz: ReadFile(MyOutH,S[1],PipeSize,L,nil); może zastosuj trochę logiki i inwencji, albo rzeczywiście znajdź studenta wszak będzie miał lepszą głowę. - _13th_Dragon 2013-10-02 01:33
Dobre :) alternatywa dla TBrain to TStudent :D - babubabu 2013-10-02 05:19
@babubabu, widzę że nie zrozumiałeś. Jak nie możesz czegoś zainstalować na komputerze bo jest zbyt stary to kupujesz nowy komputer a na nim prawdopodobnie już zainstalowano, albo przynajmniej da się zainstalować. ;) - _13th_Dragon 2013-10-02 14:42
@_13th_Dragon Zmiana głowy?? O.o Ale hardkory tu się dzieją O_O - babubabu 2013-10-02 16:05
@babubabu, może za 100 lat takie coś będzie możliwe, zaś na razie jedynie prymitywnie eksploatuje się studentów w czyich głowach w jakiś sposób TBrain jakoś zainstalowany. - _13th_Dragon 2013-10-02 16:11

Pozostało 580 znaków

2013-10-02 08:03

Rejestracja: 6 lat temu

Ostatnio: 5 lat temu

0

Gdybym nie probowal nie zawracal bym glowy.

s:='';   
   WriteFile(inH,S[1],PipeSize,L,nil);
  WriteFile(inH,'',0,L,nil);

To nie dziala.

Jezeli ta linie wyremuje ( tzn wstawie przed // ) to program odpala.

 SI.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

Złośliwcom bardzo dziekuje za pomoc ( TBrain ) i proponuje brac 2x dziennie sapientia. ( pytac w aptece )

Z tego co doczytalem to jezeli te flagi nie sa wlaczone to nie bede mogl pobierac/wysylac danych z konsoli i kolo sie zamyka.

edytowany 3x, ostatnio: tatanka, 2013-10-02 10:37

Pozostało 580 znaków

2013-10-02 14:46

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

0

Biedaczysko nigdy nie słyszało o google :/
http://lmgtfy.com/?q=WriteFile+msdn


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

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