Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Prijenos podataka između dva programa

[es] :: Pascal / Delphi / Kylix :: Prijenos podataka između dva programa

Strane: 1 2

[ Pregleda: 4787 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Prijenos podataka između dva programa03.11.2009. u 14:53 - pre 176 meseci
Na koji način riješiti komunikaciju između dva programa koji rade na istom stroju?
Oba su moja, pisana u D2007.

Po netu sam tražio i našao funkciju SendMessage(), našao sam i klasu koja radi s tim.
Program 1 pošalje poruku, program 2 primi poruku, e sad...

SendMessage šalje 2 integera kao parametre, a ja bih trebao poslati string ili strukturu. Našao sam na netu da se može poslati adresa strukture.

Pokušao sam slati Integer(@s) gdje je s string s podacima.
Code:

s := 'Test podaci';
SendMessage(receiverHandle, WM_MY_MESSAGE, Integer(Handle), Integer(@s));


Na prijemnoj strani sam pokušao:
Code:

s := PChar(Message.LParam)


Na prijemnoj strani dobijem nesuvisle podatke.

Kao to rijšiti?
Pokušao sam sa stringom i sa strukturom.

Može li mi tko napisati tih par redaka koda? Kako poslati i kako primiti poslano. Može biti string, a može i struktura...

Kod sam skinuo sa: http://users.telenet.be/ws36637/delphihook.html
Našao sam i opis slanja stringa, ali mi program koji prima poruku, ne primi ništa: http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa03.11.2009. u 15:12 - pre 176 meseci
Za komunikaciju između dve (i više) aplikacija (na istom računaru ili u LAN-u) praktično uvek koristim TClientSocket i TServerSocket.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Prijenos podataka između dva programa03.11.2009. u 15:41 - pre 176 meseci
Ima kakav dio koda koji to radi da se može ovjde staviti?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Prijenos podataka između dva programa03.11.2009. u 16:54 - pre 176 meseci
> Na koji način riješiti komunikaciju između dva programa koji rade na istom stroju?
> Oba su moja, pisana u D2007.

Prvi način je slanje WM_COPY poruka, ako tebi ne radi onda negde grešiš, pokaži kod.
Drugi načini su memory mapped files (ako se radi o ogromnoj količini podataka to je dobar način), mailslots, pipes i TCP/IP.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa03.11.2009. u 18:43 - pre 176 meseci
Citat:
franjo_tahi: Ima kakav dio koda koji to radi da se može ovjde staviti?


Kada je u pitanju nacin koji se odnosi na TCP/IP protokol koji je savkic pomenuo, ima vise nacina koji su Delphiju odmah dostupni.

Ja rekoh da najcese koristim TServerSocket/TClientSocket, mada nije lose znati da su oni u novijim Delphi/C++ Builder verzjama 'depreciated' (ne popularisu se vise), iako su bili sasvim pouzdani. Ovo garantujem jer mi neki serveri zasnovani na njima rade godinama.

Ako nikada nisi koristio ove komponente, mozda je bolje da odmah pogledas kako bi se to uradilo u Indy preko TIdTCPClient/TIdTCPServer, jer je sva slozenost TCP/IP sakrivena unutar samih metoda (funkcija), dok kod TServerSocket/TClientSocket kompletan threading i kontrolu slanja/prijema buffera treba da radis sam. Ovo nije visa matematika, ali ipak treba implementirati nekoliko trikova, a za to treba odvojiti malo vremena da se apsolvira. (Inace, Delphi primer po ovom pitanju dovodi u zabludu, jer polazi od pretpostavke da se CEO buffer salje i CEO buffer prima ODJEDNOM, sto u TCP/IP praksi i standardu ne radi tako, ali da ne duzim).

U Indy-ju je princip vrlo jednostavan:
1. KLIJENT (onaj koji uspostavlja vezu) kao parametre treba da ima IP adresu SERVERA (onoga kome se salje) i zajednicki Port kojim ce se slati. IP adresa servera je "localhost" ako se radi o istom racunaru, odnosno "127.0.0.1". Port je obican Integer broj od 0 do 65535 (u novijim standardima i vise), izuzev nekih rezervisanih, mada se i oni mogu koristiti.
2. KLIJENT pokusava da uspostavi vezu.
3. Ako SERVER nije aktivan odgovarajucim Eventom ces lako na KLIJENTU resiti nastalu situaciju i pokusati po potrebi ponovo.
4. Ako je SERVER aktivan, bice spreman da prima sve sto mu salje KLIJENT, naravno treba da se isprogramira prijem.
5. Svaka moguca greska se moze uhvatiti i na SERVERU.
6. SERVER prima Buffer, a po ISTOJ, VEC USPOSTAVLJENOJ VEZI moze nazad po potrebi da vrati neki podatak.
7. Sta ce se raditi s primljenim podacima, to je na programeru...

Postoje brojne metode (funkcije) za prijem/slanje, a koju ces koristiti, zavisi od potrebe.

U ovom primeru, KLIJENT salje sting serveru, SERVER prima string, i salje po vec uspostavljenoj konekciji datum&vreme na serveru. Sve se belezi u Memo.

Kod je na C++ Builder-u, ali je sve sam VCL pa ces se lako snaci.

(Nemoj da te zbuni zasto prvo saljem duzinu Stringa pa tek onda String. To je moj stil i profesionalna deformacija i ne mora tako. Verovatno moze i 'odjednom' sa WriteBuffer, probaj)

--- KLIJENT ---
Code:

void __fastcall TIndy9ClientForm::AskButtonClick(TObject *Sender)
{
   AskButton->Enabled = false;

   try
   {
      IdTCPClient->Connect(5000);

      AnsiString REQUEST = "Can you please tell me what's the time?";
      Memo->Lines->Add( REQUEST + " (prepared)" );

      IdTCPClient->WriteInteger( REQUEST.Length() );
      IdTCPClient->Write( REQUEST );
      Memo->Lines->Add( REQUEST + " (sent)" );

      int BytesToRead = IdTCPClient->ReadInteger();
      AnsiString RESPONSE = IdTCPClient->ReadString( BytesToRead );
      Memo->Lines->Add( RESPONSE );
   }
   __finally
   {
      IdTCPClient->Disconnect();
      AskButton->Enabled = true;
   }

}


--- SERVER ---
Code:

void __fastcall TIndy9ServerForm::IdTCPServerExecute(
      TIdPeerThread *AThread)
{
   int BytesToRead = AThread->Connection->ReadInteger();
   AnsiString REQUEST = AThread->Connection->ReadString( BytesToRead );
   Memo->Lines->Add( REQUEST + " (received)" );

   AnsiString RESPONSE = FormatDateTime( "hh:mm AM/PM", Now() );
   Memo->Lines->Add( RESPONSE + " (prepared)" );

   AThread->Connection->WriteInteger( RESPONSE.Length() );
   AThread->Connection->Write( RESPONSE );
   Memo->Lines->Add( RESPONSE + " (sent)" );        
}
void __fastcall TIndy9ServerForm::IdTCPServerStatus(TObject *ASender,
      const TIdStatus AStatus, const AnsiString AStatusText)
{
   Caption = AStatusText;        
}

 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Prijenos podataka između dva programa04.11.2009. u 03:53 - pre 176 meseci
Citat:
franjo_tahi
Kod sam skinuo sa: http://users.telenet.be/ws36637/delphihook.html
Našao sam i opis slanja stringa, ali mi program koji prima poruku, ne primi ništa: http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm


Šaljem primer pisan pre više godina. Kada sam ga pisao radio je.

Stoji još uvek u jednom konferenciskom sistemu koji više nije aktivan pa sam ga sada samo preneo ovde. Preneo sam da ne ostane neodgovoreno na ovaj citat a (i) ovde je lakše naći ovaj primer kad zatreba...
Prikačeni fajlovi
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Prijenos podataka između dva programa04.11.2009. u 12:04 - pre 176 meseci
Zahvaljuem na pomoći.
Source koji je poslao tkaranovic su ok, uz malu izmjenu:
Program koji šalje message:
Code:

 Baf := Edit1.Text;
 MCOPYDATASTRUCT.dwData := DWORD($11111111);
 MCOPYDATASTRUCT.cbData := Length(baf);
 MCOPYDATASTRUCT.lpData := Pointer(baf);
 if sendmessage(Hvnd, WM_COPYDATA, Handle,
      Integer(@MCOPYDATASTRUCT)) <>
  Length(Baf) then showmessage('gr');


Izmjenio sam red:
MCOPYDATASTRUCT.cbData := Length(baf);
pisalo je:
MCOPYDATASTRUCT.cbData := SizeOf(baf);
budući da mi je SizeOf uvijek vračao 4 kao veličinu.

Program koji prima poruke:
Code:

procedure TForm1.WMCopyDataStruct(var Message: TWMCopyData);
var
    Pcr: PChar;
    Duz: Integer;
    Point: Pointer;
    s: string;
begin
 if PCopyDataStruct(Message.CopyDataStruct)^.dwData = DWORD($11111111) then begin
  Duz := PCopyDataStruct(Message.CopyDataStruct)^.cbData;
  Point := Pointer(PCopyDataStruct(Message.CopyDataStruct)^.lpData);
  Pcr := Point;
  s := Copy(String(Pcr), 1, Duz);
  Showmessage(s);
  Message.Result := Duz;
 end;
end;


morao sam dodati: s := Copy(String(Pcr), 1, Duz);
bez toga je dobro prikazivao samo string-ove dužine 4, ostale je prikazivao duže, sa smečem na kraju, a bez obzira na param Duz.

Hvnd prog-a kom šaljem poruku dobijem :
Hvnd := FindWindow(Pchar('TApplication'), PChar('Prihvat poruke'));

Još da otkrijem kako poruku poslati servisu jer zamisao da servis komunicira s nekoliko programa, a programi međusobno - ne.

Zanimaju me ograničenja u vezi preko Indy-a. Što je s Firewall-om budući da ide preko TCP/IP i portovima? Da li ih treba otvarati i dozvoljavati pristup?
Program, zajedno sa servisom bi trebao biti što jednostavniji za instalaciju kod krajnjeg korisnika i da što manje utiče njeogva konfiguracija stroja.



[Ovu poruku je menjao franjo_tahi dana 04.11.2009. u 13:24 GMT+1]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa04.11.2009. u 12:37 - pre 176 meseci
Citat:

Još da otkrijem kako poruku poslati servisu jer zamisao da servis komunicira s nekoliko programa, a programi međusobno - ne.

Ako misliš na komunikacijuu smislu nekog obaveštavanja servisa, onda ide API ControlService()
http://www.elitesecurity.org/p1924901

Ako ćeš komunikaciju između servisa u smislu slanja podataka onda nešto od onoga što je savkic napisao.

Ili, ako znaš putanju do servisa:
1. Staviš (kreiraš) neki fajl na neko mesto
2. Pošalješ servisu poruku preko ControlService da uzme te podatke (nako čega recimo može sam da obriše taj fajl nakon preuzimanja)

(Ovo koristim kada treba iz druge aplikacije, recimo administratorske da kažem servisu da Reload-uje konfiguraciju, recimo INI)

Citat:

Zanimaju me ograničenja u vezi preko Indy-a. Što je s Firewall-om budući da ide preko TCP/IP i portovima? Da li ih treba otva
rati i dozvoljavati pristup?
Program, zajedno sa servisom bi trebao biti što jednostavniji za instalaciju kod krajnjeg korisnika i da što manje utiče njeogva konfiguracija stroja.

Ako je podešen Firewall sigurno će tražiti potvrdu za uspostavu TCP/IP komunikaciju.

Nekada se može prevariti time da se komunikacija obavlja po 'sigurnom' portu, recimo HTTP, ali u praksi Firewallovi su pametni, pa uparuju više detalja:
... + BROJ PARTICIJE + CRC32 PROGRAMA + IP + PORT + ... i ko zna šta još, tako da je potrebno inicijalno na Firewallu dozvoliti komunikaciju.


U temi postoji BCB prost primer: servisna aplikacija sa upakovanim Indy socketom, poseban program za upravljanje servisom ControlServise (start/stop/pause/korisnicki zahtevi), i klijentska aplikacija.
http://www.elitesecurity.org/p1525450
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Prijenos podataka između dva programa04.11.2009. u 14:20 - pre 176 meseci
> Još da otkrijem kako poruku poslati servisu jer zamisao da servis komunicira s nekoliko programa, a programi međusobno - ne.

Ako je servis u pitanju onda zaboravi na WM_COPYDATA, dobro rešenje je TCP/IP.

> Zanimaju me ograničenja u vezi preko Indy-a. Što je s Firewall-om budući da ide preko TCP/IP i portovima? Da li ih treba otvarati i dozvoljavati pristup?

Ne znam da li se integrisani Windows firewall buni ako se komunikacija odvija samo unutar lokalnog računara, znam da postoji i neki API kako da se otvore portovi na firewallu, ali nisam to koristio.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 06:25 - pre 175 meseci
Slažem se sa konstatacijama da WM_COPYDATA nije za komunikaciju servisa sa programima, ali evo par detalja vezanih za takvu komunikaciju.

Pre svega servis.interactire mora biti true, inače je to tako i za druge opcije.

Mogu programi da se jave serveru tako što bi se napravila jedinstvena poruka:

Code:

JednaInstancaMsg := RegisterWindowMessage('jedinstvenoime');


da se doda servisu wndproc u kojoj bi primao poruke (JednaInstancaMsg i WM_COPYDATA):

Code:
 
OldWProc := TFNWndProc(SetWindowLong(Forms.Application.Handle, GWL_WNDPROC, LongInt(@NewWndProc)));


pa da programi šalju servisu pozdravne poruke ovako:

Code:

BroadCastSystemMessage(BSF_IGNORECURRENTTASK, @dwBSM, JednaInstancaMsg, Handle, appbroj);


Servis bi mogao i da proveri da li je Handle od (nekog od) programa o kojem vodi racuna ili jedinstveno ime koristi još neki (strani) program. Mada je mala verovatnoæa da se za neko jedinstveno ime tako nešto desi.

 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 09:26 - pre 175 meseci
Hvala na pomoći. Uspio sam napraviti vezu između programa i servisa pomoći Indy kontrole.
Komunikacija radi.
Imam još par problema...
1. Nakon što napravim "IntraReg /Install" seris se instalira, ali ne i starta. Moram otići u servise i to napraviti ručno. Što napraviti da se automatski starta.
2. Kada u servisima želim zaustaviti instalirani servis, nakon pritiska na "Stop" dobijem poruku:
"Windows could not stop the IntraReg serivce on Local Computer. The service did not return error. This could be an internal Windows error or an internal service error."
Nakon što ponovno pritisnem gumb "Stop", servis se stopira, ali dobijem poruku: "Windows cold not stop IntraReg service on Local Computer. Error 1061: The service cannot accept control messages at this time."

U ovom području nemam iskustva.
Zar na ovaj način komunikacije, poruku ne prime svi programi koji osluškuju zadati port?
Postoji li način da poruku primi samo moj servis?
Samo napomena: oba su programa na istom stroju, slanje poruka između dva različita kompa mi ovaj put ne treba.

Prilažem oba prog-a. Za slanje poruke i servisa za prihvat.


Prikačeni fajlovi
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 10:07 - pre 175 meseci
U vezi autostarta. Da ne prepričavam, data su dva rešenja. Jedno je sa kodom u AfterInstall, a drugo je sa analizom eventualnih dodatnih komandnih parametara pri instalaciji, dakle service1.exe /install /start

Citat:

> I am using vcl's TService class.
> I get install myservice, but I can't start it.

Yes, you can.

> I need install and after, start it.

Then do so. There is nothing stopping you from doing it.

> Myservice is present in SCM, but no started.

TService does not auto-start itself after being installed. You need to
start it manually, such as by calling the StartService() function in the
TService's AfterInstall event handler.

> How do I to install and start myservice for code?

Call OpenSCManager(), OpenService(), and StartService() in the AfterInstall
event. For example:

void __fastcall TMyService::AfterInstall(TService *Sender)
{
SC_HANDLE hManager = OpenSCManager(NULL, NULL,
SC_MANAGER_ALL_ACCESS);
if( hManager )
{
SC_HANDLE hService = OpenService(hManager, Sender->Name.c_str(),
SERVICE_START);
if( hService )
{
StartService(hService, 0, NULL);
CloseServiceHandle(hManager);
}
CloseServiceHandle(hManager);
}
}

To take it a step further, you can optionally add a second command-line
parameter, such as "/start", so that you can pick-and-choose whether to
auto-start the service after being installed, ie:

void __fastcall TMyService::AfterInstall(TService *Sender)
{
if( !FindCmdLineSwitch("start", TSysCharSet() << '-' << '/', true) )
return;

SC_HANDLE hManager = OpenSCManager(NULL, NULL,
SC_MANAGER_ALL_ACCESS);
//...
}

> No problem in use command line to install it (myservice /install).
> But I can't request the user of my program to start my service
> manual. I want the user click in my "setup.exe" file of the installing
> and "setup.exe" install and start myservice.exe.

Again, you could have setup.exe start the service separately after
installing it. What are you using to write setup.exe in the first place?
Most scriptable setup packages, such as InstallShield, support calling Win32
API functions directly. You can have setup.exe execute "myservice.exe
/install" and then call the StartService() function afterwards. In fact,
there is even third-party script code floating around for many of the major
setup packages for interfacing with the SCM.

If you can't get that working in your setup package, then you could
alternatively just write a separate .exe that calls StartService(), and then
have setup.exe execute that .exe file after "myservice.exe /install" exits.


Gambit
 
Odgovor na temu

stankons
Stanko Milošev
ise Gmbh, Deutschland
Bonn

Član broj: 99408
Poruke: 231
*.trinet.si.

ICQ: 147767352
Sajt: www.milosev.com


Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 10:09 - pre 175 meseci
Samo da dam jednu sugestiju, na brzinu, koristi RemObjects, odličan je za komunikaciju između dva programa...
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 10:54 - pre 175 meseci
> Nakon što ponovno pritisnem gumb "Stop", servis se stopira, ali dobijem poruku: "Windows cold not stop IntraReg service on Local
> Computer. Error 1061: The service cannot accept control messages at this time."

ServiceThread.ProcessRequests handluje zahteve services managera, dakle moraš periodično pozivati tu funkciju. Ubaci je unutar petlje u Execute metodi.

> Zar na ovaj način komunikacije, poruku ne prime svi programi koji osluškuju zadati port?

Jedan TCP/IP port može držati samo jedan program, jedini drugi koji mogu osluškivali to isto su drajveri.


 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 13:05 - pre 175 meseci
Skoro pa sam uspio napraviti servis da radi kako treba (još sam posao koji će raditi servis nisam niti počeo raditi).
Ostaje problem sa startom servisa.
Servis uredno instalira, deinstalira i starta kada to napravim ručno ili iz drugog programa.
Kopirao sam proceduru koja iz drugog programa uredno starta servis, a unutar servisa ge ne pogrene.

Code:

procedure TIntraReg.ServiceAfterInstall(Sender: TService);
var ms: boolean;
   hScmHandle, hServiceHandle : SC_HANDLE;
   arg: PChar;
begin
   ms := true;
   hScmHandle := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
   if hScmHandle <> 0 then begin
      hServiceHandle := OpenService(hScmHandle, PChar('IntraReg'), SERVICE_ALL_ACCESS);
      arg := Nil;
      if hServiceHandle <> 0 then StartService(hServiceHandle, 0, arg);
      CloseServiceHandle(hServiceHandle);
      CloseServiceHandle(hScmHandle);
   end;
end;


provjerio sam (upis u file) varijable hScmHandle i hServiceHandle, različite su od 0
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 13:10 - pre 175 meseci
Verovatno u pozivu OpenService():
SERVICE_ALL_ACCESS --- > SERVICE_START

Takodje, proveri da li se servis zove ovako:
PChar('IntraReg')

... hocu reci, da li je tako i u Name a ne samo u EXE nazivu.

Citat:
provjerio sam (upis u file) varijable hScmHandle i hServiceHandle, različite su od 0

he he :) oces reci da ShowMessage ne radi u servisu :)
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 13:35 - pre 175 meseci
Citat:
X Files: Verovatno u pozivu OpenService():
SERVICE_ALL_ACCESS --- > SERVICE_START

Takodje, proveri da li se servis zove ovako:
PChar('IntraReg')

... hocu reci, da li je tako i u Name a ne samo u EXE nazivu.


he he :) oces reci da ShowMessage ne radi u servisu :)


- promjenio sam SERVICE_ALL_ACCESS --- > SERVICE_START
- U name piše IntraReg, u popisu servisa piše IntraReg, exe file se zove RegIntra.exe

Servis se i dalje ne starta automatski.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 14:29 - pre 175 meseci
Piše u poruci (doduše na engleskom) koju je stavio xfiles da servis ne može sam sebe da startuje. Koliko sam razumeo prethodnu poruku:

> Kopirao sam proceduru koja iz drugog programa uredno starta servis, a unutar servisa ge ne pogrene.

znači da je TIntraReg.ServiceAfterInstall je u servisu a to ne može. Kad se instalira servis instaler ga startuje a pri svakom pokretanju os-a (win) će servis biti automatski startovan.

U Execute stoji: sleep(10000), što je 10 sekundi. Tu treba da stoji 1000 maksimalno. Nadam se da si pročitao ono što je savkic napisao da u petlji treba da stoji ServiceThread.ProcessRequests.


Dodao bi da je ovih dana neko pitao kako da proverava da li je neki program startovan ili nije da bi mogao da ga startuje ako nije a u kodu koji je poslao franjo_tahi je i funkcija KilApp. Ona proverava da li je program startovan i može da se iskoristi kako za zatvarnje tako i za startovanje, ako nije startovan.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Prijenos podataka između dva programa05.11.2009. u 16:41 - pre 175 meseci
Ovo u C++ Builder-u radi (Startovanje ide automatski, odmah nakon instalacije)
Code:

void __fastcall TService1::ServiceAfterInstall(TService *Sender)
{
    SC_HANDLE hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if( hManager )
    {
        SC_HANDLE hService = OpenService(hManager, Sender->Name.c_str(), SERVICE_START);
        if( hService )
            StartService(hService, 0, NULL);
        CloseServiceHandle(hManager);
    }
}


Verujem da ces resiti problem, moguce je da je do onoga sto ti je savkic napomenuo.

Inace, u bilo kojoj instalacionoj proceduri, recimo InnoSetup, mozes podesiti da se servis instalira, pri cemu ce i start biti automatski s ovom gore kodom. Ako bas ne uspes s ovim kodom (iz ne znam ni ja kog razloga), mozes kreirati i posebu start service aplikaciju koju ces pozvati u samoj instalacionoj proceduri (nakon instalacije servisa) koja ce pokrenuti servis. Mada ovo je krajnja varijanta.


 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Prijenos podataka između dva programa06.11.2009. u 01:55 - pre 175 meseci
Interesantno...

Probao sam sad i sa d2010 IntraReg hoće da se startuje iz AfterInstall. Hoće i bez izmena Execute.
Nije hteo jedino ako/kad IdS ima problem sa firewallom.

Inače može da se doda:

Code:

    if StartService(hServiceHandle, 0, arg) then begin
      SetControlState(hServiceHandle, SERVICE_RUNNING, ServiceStatus);
      RadiLiPriInstalaciji := ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    end else
     RadiLiPriInstalaciji := false;


 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Prijenos podataka između dva programa

Strane: 1 2

[ Pregleda: 4787 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.