Odczyt parametru z uruchomionego programu

0

Witam!
Wyczytalem juz jak poznac parametr uruchomionego programu napisanego w Delphi

label1.caption := ParamStr(1);

Wiem, ze to na pewno tez bedzie banalne, ale w jaki sposob odczytac parametr z innego programu, programem napisanym w Delphi ?

Przyklad:

  • Istnieje program o nazwie "ProgramX", po uruchomieniu ktorego tworzy sie losowa zawartosc linii komend, z ktora jest on odpalony (za kazdym razem inna).
  • Chce napisac program w Delphi, ktory po odpaleniu "ProgramuX", wyciagalby parametr, z ktorym "ProgramX" jest w chwili obecnej uruchomiony.

Z gory dziekuje za pomoc
Pozdrawiam

0
~Pawel napisał(a)

Witam!
Przyklad:

  • Istnieje program o nazwie "ProgramX", po uruchomieniu ktorego tworzy sie losowa zawartosc linii komend, z ktora jest on odpalony (za kazdym razem inna).
  • Chce napisac program w Delphi, ktory po odpaleniu "ProgramuX", wyciagalby parametr, z ktorym "ProgramX" jest w chwili obecnej uruchomiony.

A co rozumiesz przez "tworzy sie losowa zawartosc linii komend ..." i tak dalej? Moze jestem glupi, ale dla mnie to niejasne.

Rozwiazanie a:
Program1 zapisuje swoje cos do pliku ktory odczytuje program 2
Rozwiazanie b:
memory mapped files.

0

Nie chcialem za bardzo mieszac, wiec to skrocilem :) Ogolnie to sa 2 exeki, jednym z nich odpala sie program (on wywoluje drugiego wlasnie z jakas linia polecen). Gdy probujemy recznie uruchomic exe numer 2 wyskakuje blad (bez odpowiedniej linii polecen po prostu sie nie uruchomi). Zreszta to jest zupelnie niewazna sprawa.
Chodzi tylko o to jak zczytac z jakimi parametrami jest uruchomiony docelowy exek (program), zeby moc go odpalic za pomoca mojego programu (tutaj tez bym musial sie troche rozpisac, ale dokladny sposob dzialania jest tu po prostu zbedny - nie zmienia to faktu, ze potrzebuje procedurki, ktora wyciagnie parametry zewnetrznego exeka).
Prosilbym o przyklad w kodzie, bo jestem poczatkowym programista.
Moze da sie to rozwiazac np jakos przez uchwyt okna ? Znam tytul programu, wiec uchwyt moge bez problemu zczytac. Po prostu nie mam tylko pojecia jak wyciagnac informacje z jakimi parametrami zostal uruchominy ten program :(

0
procedure TForm1.FormCreate(Sender: TObject);
begin
if paramstr(1) = '-a' then ShowMessage('podano parametr "-a"');
// else ShowMessage('Nieznany parametr');
end;
0

heh wiedzialem, ze tym drugim postem zamieszam. Jeszcze raz od poczatku.

Uruchamiam pewien program, ktory sie odpala z jakims parametrem (powiedzmy "c:\program.exe" -parametr).
Chcialbym stworzyc nowa aplikacje w Delphi, ktora powie mi z jakim parametrem zostal uruchomiony ten program, czyli wyciagnie "-parametr" z uruchomionego "programu.exe".
Mam nadzieje, ze teraz jest to bardziej zrozumiale :)

0

Nie wiem czy dobrze myśle, ale chyba chcesz powiedzieć, że:
Program A uruchamia program B z jakimś parametrem, a ty chcesz napisać program C, który odczyta ten parametr.
Najprawdopodobniej chcesz coś "zkrakować" :D będziesz musiał użyć debugera, deassamblera lub czegoś takiego , żeby wyciągnąć wartość z programu A lub programu B.
Mam tylko nadzieje, że nie "krakujesz" mojego progsa :]

0

jesli dobrze rozumiem to potrzebujesz czegos takiego jak udostepnia ProcessExplorer (freeware: http://www.sysinternals.com/ ) w kolumnie CommandLine.
jesli chcesz to zrobic z pomoca delphi... banal:
uzyj madCollection:

uses madKernel;
[...]

var S:String;
begin
S:=madKernel.Process('nazwa_procesu.exe').CommandLine;
ShowMessage(S);
end;

:)

pozdro [browar]
cimak.

0

ale jeśli chcesz to zrobić bez madshi collection, to już wcale nie taki banał:

function GetCmdLine(hProcess : thandle) : string; overload;
var
  h2 : thandle;
  PROCESSENTRY32 : TPROCESSENTRY32;
  i,j : cardinal;
  buf : array of char;
  memStart : pointer;
  memInfo : MEMORY_BASIC_INFORMATION;
  s     : string;
begin
  result := '';
  h2 := OpenProcess (PROCESS_ALL_ACCESS, FALSE, hProcess);
  if h2 = 0 then exit;

  memstart := pointer($20000);
  while VirtualQueryEx(h2, memstart, memInfo, SizeOf(MEMORY_BASIC_INFORMATION)) = SizeOf(MEMORY_BASIC_INFORMATION) do
  begin
    if (meminfo.State = MEM_COMMIT) then
    begin
      setlength(buf,meminfo.RegionSize);
      if ReadProcessMemory(h2, memInfo.BaseAddress, buf, memInfo.RegionSize, i) then
      begin
         move(buf[1176],buf[0],meminfo.RegionSize-1176);

         i := Pos(#0#0,string(buf));
         move(buf[i+6],buf[0],meminfo.RegionSize-i-6);
         i := pos(#0#0,string(buf));
         while buf[i] = #0 do inc(i);
         move(buf[i],buf[0],meminfo.RegionSize-i);

         j := pos(#0#0,string(buf)) div 2;
         setlength(s,j);
         for i := 0 to j-1 do s[i+1] := buf[i*2];

         result := s;
         break;
      end;
      buf := nil;
    end;
    integer(memstart) := integer(meminfo.BaseAddress) + meminfo.regionsize;
  end;
  CloseHandle(h2);
end;


function GetCmdLine(path : string) : string; overload;
var
  h,h2 : thandle;
  PROCESSENTRY32 : TPROCESSENTRY32;
  i,j : cardinal;
begin
  result := '';
  h2 := 0;
  h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  PROCESSENTRY32.dwSize := SizeOf(PROCESSENTRY32);
  if not Process32First(h,PROCESSENTRY32) then i := getlasterror;

  repeat
    if PROCESSENTRY32.szExeFile = path then
    begin
      h2 := PROCESSENTRY32.th32ProcessID;
      break;
    end;
  until not Process32Next(h,PROCESSENTRY32);
  CloseHandle(h);
  if h2 = 0 then exit;

  result := GetCmdLine(h2);
end;

trzeba też dodać TlHelp32 do sekcji uses.
cmdline działa tylko dla procesów uruchomionych przez użytkownika, pewnie brakuje odpowiednich praw przy otwieraniu procesu, ale nie chce mi się nad tym siedzieć.

całość na http://fronczyk.no-ip.com/pub/readprocesscmdline.zip , o ile mam włączony komputer

0

A może po prostu napisz program C, którym podmienisz B. Program A wyśle do B (czyli rzeczywistego C) parametry, C je przejmie, a ostatecznie uruchomi przeniesiony B z tymi parametrami.

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