/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Sende beskeder mellem programmer
Fra : Harald


Dato : 18-01-03 18:00

Hej

Det har vist været oppe før men jeg kan ikke finde det. Jeg har brug for at
kunne sende en streng mellem programmer, jeg gør det på følgende måde, det
virker men er det den rigtige (fejlfrie) måde at gøre det på?

I alle programmer opretter jeg en en unique message på denne måde:
var
WM_TESTMESSAGE : DWORD;
begin
WM_TESTMESSAGE:=RegisterWindowMessage('TESTMESSAGE');
end;

Når jeg så sender en streng fra program A gør jeg sådan:
var
sendtext : string = 'Dette er en test streng'; // en global variable
begin
postMessage(HWND_BROADCAST, WM_TESTMESSAGE, longword(sendtext) ,0);
end;

I program B modtager jeg så strengen i OnMessage functionen sådan:
var
tekst : string;
begin
if msg.message=WM_TESTMESSAGE then
begin
tekst:=string(msg.wParam);
showmessage(tekst);
end;

Mvh
HK



 
 
Harald (18-01-2003)
Kommentar
Fra : Harald


Dato : 18-01-03 22:31

"Harald" <swobu@kroning.dk> skrev i en meddelelse
news:3e29883c$0$71625$edfadb0f@dread11.news.tele.dk...
> Hej
>
> Det har vist været oppe før men jeg kan ikke finde det. Jeg har brug for
at
> kunne sende en streng mellem programmer, jeg gør det på følgende måde, det
> virker men er det den rigtige (fejlfrie) måde at gøre det på?

Glem det, det virker self. ikke, men hvordan gør man så?

Mvh
HK



David A. D. Konrad (18-01-2003)
Kommentar
Fra : David A. D. Konrad


Dato : 18-01-03 23:30

"Harald" <swobu@kroning.dk> skrev i en meddelelse
news:3e29c7b1$0$71625$edfadb0f@dread11.news.tele.dk...
> "Harald" <swobu@kroning.dk> skrev i en meddelelse
> news:3e29883c$0$71625$edfadb0f@dread11.news.tele.dk...
> > Hej
> >
> > Det har vist været oppe før men jeg kan ikke finde det. Jeg har brug for
> at
> > kunne sende en streng mellem programmer, jeg gør det på følgende måde,
det
> > virker men er det den rigtige (fejlfrie) måde at gøre det på?
>
> Glem det, det virker self. ikke, men hvordan gør man så?

De gange jeg har haft brug for en sådan kommunikation, har jeg udvekslet
beskederne via filer i et særligt "kommunikationskatalog" - f.eks /messages
eller lignende. Du definerer slet og ret et koncept mht filnavne/indhold og
lægger koden + eventuelle konstanter ind i en unit som dine forskellige
programmer kan benytte.

Hvad dine metoder så skal gøre, er slet og ret at overvåge dit
message-katalog for message-filer med API-funktionerne WaitForSingleObject
mv, gemme message-filer samt slette message-filer. Fremgangsmåden fungerer
aldeles glimrende, man har ingen begrænsninger mht hvad der kan udveksles og
responsen kan være praktisk talt så hurtig som en message [ned til
1ms]...Ydermere kan man genbruge konceptet i alle sine programmer, og man
kan snildt opbygge læssevis af "message-typer" som de enkelte programmer kan
vælge at respondere på eller ej. Fremgangsmåden tager ikke plads op, eller
sløver programmerne ned, på nogen som helst måde.




Harald (19-01-2003)
Kommentar
Fra : Harald


Dato : 19-01-03 00:21

"David A. D. Konrad" <david_konrad@hotmail.com> skrev i en meddelelse
news:b0ckg8$b8p$1@sunsite.dk...
> "Harald" <swobu@kroning.dk> skrev i en meddelelse
> news:3e29c7b1$0$71625$edfadb0f@dread11.news.tele.dk...
> > "Harald" <swobu@kroning.dk> skrev i en meddelelse
> > news:3e29883c$0$71625$edfadb0f@dread11.news.tele.dk...
> > > Hej
> > >
> > > Det har vist været oppe før men jeg kan ikke finde det. Jeg har brug
for
> > at
> > > kunne sende en streng mellem programmer, jeg gør det på følgende måde,
> det
> > > virker men er det den rigtige (fejlfrie) måde at gøre det på?
> >
> > Glem det, det virker self. ikke, men hvordan gør man så?
>
> De gange jeg har haft brug for en sådan kommunikation, har jeg udvekslet
> beskederne via filer i et særligt "kommunikationskatalog" - f.eks
/messages
> eller lignende. Du definerer slet og ret et koncept mht filnavne/indhold
og
> lægger koden + eventuelle konstanter ind i en unit som dine forskellige
> programmer kan benytte.
>
> Hvad dine metoder så skal gøre, er slet og ret at overvåge dit
> message-katalog for message-filer med API-funktionerne WaitForSingleObject
> mv, gemme message-filer samt slette message-filer. Fremgangsmåden fungerer
> aldeles glimrende, man har ingen begrænsninger mht hvad der kan udveksles
og
> responsen kan være praktisk talt så hurtig som en message [ned til
> 1ms]...Ydermere kan man genbruge konceptet i alle sine programmer, og man
> kan snildt opbygge læssevis af "message-typer" som de enkelte programmer
kan
> vælge at respondere på eller ej. Fremgangsmåden tager ikke plads op, eller
> sløver programmerne ned, på nogen som helst måde.

Jeg havde håbet på at der var en simpel måde at gøre det på, det eneste jeg
skal er at sende en streng til et andet program ca. 10-15 gange i løbet af
en dag. Så laver jeg det sådan at program A smider strengen ind i
udklipsholderen og bruger PostMessage til at fortælle program B at der
ligger en ny streng.

Tak for svaret
/HK



David A. D. Konrad (19-01-2003)
Kommentar
Fra : David A. D. Konrad


Dato : 19-01-03 00:44

"Harald" <swobu@kroning.dk> skrev i en meddelelse
news:3e29e15d$0$71704$edfadb0f@dread11.news.tele.dk...

> Jeg havde håbet på at der var en simpel måde at gøre det på,

Det *er* altså også temmelig simpelt. Du kan gøre det på 20 linier - både at
sende og modtage.

> det eneste jeg
> skal er at sende en streng til et andet program ca. 10-15 gange i løbet af
> en dag. Så laver jeg det sådan at program A smider strengen ind i
> udklipsholderen og bruger PostMessage til at fortælle program B at der
> ligger en ny streng.

Ja, det er en mulighed, men den rummer potentiel fare for at det går galt -
f.eks hvis clipboardet tømmes/sættes medens dit program prøver på det samme.
Dit program vil også - og det er endnu værre - slette det, der er i
udklipsholderen i forvejen. Løsningen kunne være at registrere sit eget
cliboardformat, men det lyder da først rigtigt besværligt




Harald (19-01-2003)
Kommentar
Fra : Harald


Dato : 19-01-03 02:19

"David A. D. Konrad" <david_konrad@hotmail.com> skrev i en meddelelse
news:b0cos9$q51$1@sunsite.dk...
> "Harald" <swobu@kroning.dk> skrev i en meddelelse
> news:3e29e15d$0$71704$edfadb0f@dread11.news.tele.dk...
>
> > Jeg havde håbet på at der var en simpel måde at gøre det på,
>
> Det *er* altså også temmelig simpelt. Du kan gøre det på 20 linier - både
at
> sende og modtage.
>
> > det eneste jeg
> > skal er at sende en streng til et andet program ca. 10-15 gange i løbet
af
> > en dag. Så laver jeg det sådan at program A smider strengen ind i
> > udklipsholderen og bruger PostMessage til at fortælle program B at der
> > ligger en ny streng.
>
> Ja, det er en mulighed, men den rummer potentiel fare for at det går
galt -
> f.eks hvis clipboardet tømmes/sættes medens dit program prøver på det
samme.
> Dit program vil også - og det er endnu værre - slette det, der er i
> udklipsholderen i forvejen. Løsningen kunne være at registrere sit eget
> cliboardformat, men det lyder da først rigtigt besværligt

Jeg fandt WM_COPYDATA metoden, har prøvet den og det ser ud til at virke. Da
program A der sender strengen ikke ved hvilke programmer der skal modtage
strengen bruger jeg HWND_BROADCAST i SendMessage.
Jeg har også kikket på bla. WaitForSingleObject men kan ikke lige se hvordan
det kan bruges her, men det er nok fordi jeg ikke fatter hvad
WaitForSingleObject overhovedet bruges til . Du snakker om filnavne,
mener du så at du skriver noget til en fil på harddisken og så læser denne
fil igen fra et andet program?

Mvh
HK




David A. D. Konrad (19-01-2003)
Kommentar
Fra : David A. D. Konrad


Dato : 19-01-03 02:48

"Harald" <swobu@kroning.dk> skrev i en meddelelse
news:3e29fd07$0$129$edfadb0f@dtext02.news.tele.dk...

> Jeg fandt WM_COPYDATA metoden, har prøvet den og det ser ud til at virke.
Da
> program A der sender strengen ikke ved hvilke programmer der skal modtage
> strengen bruger jeg HWND_BROADCAST i SendMessage.
> Jeg har også kikket på bla. WaitForSingleObject men kan ikke lige se
hvordan
> det kan bruges her, men det er nok fordi jeg ikke fatter hvad
> WaitForSingleObject overhovedet bruges til . Du snakker om filnavne,
> mener du så at du skriver noget til en fil på harddisken og så læser denne
> fil igen fra et andet program?

Ja - nu har jeg desværre ikke en delphi installeret på den 'puter jeg sidder
ved pt, men jeg kan da nok komme med et eksempel i morgen...Det er dog
rimelig nemt at lave. Princippet går slet og ret ud på at have et koncept
omkring messagefiler, kreere filer, registrere nye forekomster af filer og
slette dem igen.

Her er princippet :

Vi har program A og program B kørende. Al kommunikation imellem de to
programmer foregår via filer. Filer der hedder "request" er en forespørgsel,
filer der hedder "response" er et svar. En fil med extensionen A er til
programmet A, en fil med extensionen B er til programmet B. Når A vil
kommunikere med programmet B, laver den slet og ret en fil i et
foruddefineret katalog de har "aftalt" skal være kommunikationskataloget,
med navnet "request.b". Programmet B ved nu, at her er en besked, kan læse
beskeden og trigge de events/programdele der er aktuelle i forhold til
filens indhold. Hele tricket består faktisk i et bæredygtigt system.

Her er fremgangsmåden :

Når program A henholdsvis program B starter op, "initialiserer" de hver især
en handle til det katalog der skal fungere som kommunikationskatalog. Dette
gøres med FindFirstChangeNotification ala

kommunikation_katalog_handle:=FindFirstChangeNotification('messages',true/fa
lse,FILE_NOTIFY_CHANGE_FILE_NAME ...whatever)

(slå selv brugen op)

Derefter indlæser du listen af filer fra kataloget - hvis der er nogen, så
du kan sammenligne med en senere status.

Selve overvågningen af kataloget pakker du ind i en tread's execute metode
ala

// --> pseudokode, blot eksempel - sidder ikke med delphi...

procedure Tminthread.execute;
var result : integer;
begin
while not terminated do
begin
result:=WaitForSingleObject(kommunikation_katalog_handle,100);
if result=WAIT_OBJECT_0 then
begin
//find nye filer - sammenlign med oprindelig status
//er der en ny fil til "mig" - f.eks "request.A"
//hvis ja, læs beskedens indhold og aktiver en event du har i dit
hovedprogram
begin
MessageReceivedEvent(indhold);
//slet fil, eller kør en FindNextChangeNotification
end;
//
end;
end;

Det er faktisk rimelig simpelt. Jeg er sikker på du kan finde eksempler på
nettet du kan komme videre med. De tre API-kald jeg benytter ovenover anser
jeg i øvrigt for at være blandt de allermest brugbare, da de kan bruges til
en række forskellige formål. Håber det hjalp en smule!





Harald (19-01-2003)
Kommentar
Fra : Harald


Dato : 19-01-03 13:05

"David A. D. Konrad" <david_konrad@hotmail.com> skrev i en meddelelse
news:b0d041$e8q$1@sunsite.dk...
> "Harald" <swobu@kroning.dk> skrev i en meddelelse
> news:3e29fd07$0$129$edfadb0f@dtext02.news.tele.dk...
>
> > Jeg fandt WM_COPYDATA metoden, har prøvet den og det ser ud til at
virke.
> Da
> > program A der sender strengen ikke ved hvilke programmer der skal
modtage
> > strengen bruger jeg HWND_BROADCAST i SendMessage.
> > Jeg har også kikket på bla. WaitForSingleObject men kan ikke lige se
> hvordan
> > det kan bruges her, men det er nok fordi jeg ikke fatter hvad
> > WaitForSingleObject overhovedet bruges til . Du snakker om filnavne,
> > mener du så at du skriver noget til en fil på harddisken og så læser
denne
> > fil igen fra et andet program?
>
> Ja - nu har jeg desværre ikke en delphi installeret på den 'puter jeg
sidder
> ved pt, men jeg kan da nok komme med et eksempel i morgen...Det er dog
> rimelig nemt at lave. Princippet går slet og ret ud på at have et koncept
> omkring messagefiler, kreere filer, registrere nye forekomster af filer og
> slette dem igen.
>
> Her er princippet :
>
> Vi har program A og program B kørende. Al kommunikation imellem de to
> programmer foregår via filer. Filer der hedder "request" er en
forespørgsel,
> filer der hedder "response" er et svar. En fil med extensionen A er til
> programmet A, en fil med extensionen B er til programmet B. Når A vil
> kommunikere med programmet B, laver den slet og ret en fil i et
> foruddefineret katalog de har "aftalt" skal være kommunikationskataloget,
> med navnet "request.b". Programmet B ved nu, at her er en besked, kan læse
> beskeden og trigge de events/programdele der er aktuelle i forhold til
> filens indhold. Hele tricket består faktisk i et bæredygtigt system.
>
> Her er fremgangsmåden :
>
> Når program A henholdsvis program B starter op, "initialiserer" de hver
især
> en handle til det katalog der skal fungere som kommunikationskatalog.
Dette
> gøres med FindFirstChangeNotification ala
>
>
kommunikation_katalog_handle:=FindFirstChangeNotification('messages',true/fa
> lse,FILE_NOTIFY_CHANGE_FILE_NAME ...whatever)
>
> (slå selv brugen op)
>
> Derefter indlæser du listen af filer fra kataloget - hvis der er nogen, så
> du kan sammenligne med en senere status.
>
> Selve overvågningen af kataloget pakker du ind i en tread's execute metode
> ala
>
> // --> pseudokode, blot eksempel - sidder ikke med delphi...
>
> procedure Tminthread.execute;
> var result : integer;
> begin
> while not terminated do
> begin
> result:=WaitForSingleObject(kommunikation_katalog_handle,100);
> if result=WAIT_OBJECT_0 then
> begin
> //find nye filer - sammenlign med oprindelig status
> //er der en ny fil til "mig" - f.eks "request.A"
> //hvis ja, læs beskedens indhold og aktiver en event du har i dit
> hovedprogram
> begin
> MessageReceivedEvent(indhold);
> //slet fil, eller kør en FindNextChangeNotification
> end;
> //
> end;
> end;
>
> Det er faktisk rimelig simpelt. Jeg er sikker på du kan finde eksempler på
> nettet du kan komme videre med. De tre API-kald jeg benytter ovenover
anser
> jeg i øvrigt for at være blandt de allermest brugbare, da de kan bruges
til
> en række forskellige formål. Håber det hjalp en smule!

Ja tak nu kan jeg se hvordan det bruges, meget smart.

Mvh
HK



Finn Bindeballe (19-01-2003)
Kommentar
Fra : Finn Bindeballe


Dato : 19-01-03 12:06

hej der......

naar jeg har brug for den slags, bruger jeg en INDY - UDP client og server...
det er meget nemt og fleksibelt.
eks.

paa modtageren sætter du en UDP Server socket.....og i dens onUDPREAD event
laver du som flg.
----------------------------------------------------------------------------------------------------------

procedure TMAPPER_1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
d(DataStringStream.DataString);
if DataStringStream.DataString='MAPPER1=ON' then Timer1.Enabled:= true;
if DataStringStream.DataString='MAPPER1=OFF' then Timer1.Enabled:= False;
if DataStringStream.DataString='MAPPER1 LOG=1' then LOG:= true;
if DataStringStream.DataString='MAPPER1 LOG=0' then LOG := False;
if DataStringStream.DataString='MAPPER1 TRIG' then Trig;
finally
DataStringStream.Free;
end;
end;
-------------------------------------------------------------------------------------------------------

paa 'senderen' sætter du en udpClientSocket

og med flg. kan du saa 'trigge' ting i modtageren....
--------------------------------------------------
IdUDPClient1.Send('MAPPER1 TRIG');
--------------------------------------------------

Det eneste du skal være opmerksom paa er at du skal bruge de samme
porte........*S*

/F



Harald (19-01-2003)
Kommentar
Fra : Harald


Dato : 19-01-03 12:44

"Finn Bindeballe" <FinnB@Post6.Tele.DK> skrev i en meddelelse
news:3E2A8696.1CB8848F@Post6.Tele.DK...
> hej der......
>
> naar jeg har brug for den slags, bruger jeg en INDY - UDP client og
server...
> det er meget nemt og fleksibelt.
> eks.
>
> paa modtageren sætter du en UDP Server socket.....og i dens onUDPREAD
event
> laver du som flg.

<KLIP>

Nok ikke en brugbar løsning til mig da der kan værer flere modtagere og de
kan vel ikke lytte på samme port.

Mvh
HK



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste