komunikacja między aplikacjami

0

Witam. Chciałbym zrobić wymiane wartości pewnych zmiennych między dowma programami...próbowałem już za pomoca piku ale to działało tylko przy kontrololowanym rzeslaniu(tzn musiałem ja decydować kiedy co ma być przeslane) w innym przypadku kiedy jedem program cos zapisywyał lub odczytywał drugi niec nie mógł robic w tym pliku... pomyślalem więc o adresach komórek pamięci....na początku programy wymieniaja sie jednorazowo adresem komórke pamieci gdzie sa umieszczone pewne dane poprzez plik a nastepnie odwołując sią do tych adresów mogły by odczytac wartości z pamięci ....tylko dlaczego to nie działa ... oto kod :
PROGRAM1:

program test;
uses dos;
type

wskx=^integer;
var
x1:integer;
wskx1:wskx;
plik:file of wskx ;
begin
readln(x1);
new(wskx1);
wskx1:=@x1;
assign(plik,'c:\test.bin');
rewrite(plik);
write(plik,wskx1);
close(plik);
writeln('ok1');
readln;
end.

PROGRAM2:

program test2;
uses dos;
type
wsky=^integer;
var
y1:integer;
wsky1:wsky;
plik:file of wsky;
begin
new(wsky1);
assign(plik,'c:\test.bin');
reset(plik);
read(plik,wsky1);
close(plik);
writeln(wsky1^);
readln;
end.

P.S szczerze mówiąc ma mi to służyć do tego ze napisałem grę w pascalu i teraz wpadłem na pomysł żeby zrobić multiplayer .....wiec zrobiłem aplikacje w Delphi która przesyła i odbiera położenie ..teraz tylko problem na połączeniu tych w duch aplikajcji ...

0

Takie rzeczy to tylko w Erze ;) sorry ale trochę się rozbawiłem. Tak było można w Win3.x i chyba 95, nie pamiętam. W Win32 każdy proces ma swoją przestrzeń adresową i taki "numer" nie przejdzie. Można to zrobić za pomocą komunikowania się przez obszar danych biblioteki dll, czyli wykorzystując mechanizm plików odwzorowanych, ale pewnie o wiele lepiej i prościej zrobić to tak jak robi to sam system, czyli przez obsługę odpowiednich wiadomości. W necie pewnie jest full na ten temat, tak więc nie będę się rozwodził...

Pozdrawiam.

0

:-/ PO ŹLE ZROBIŁEŚ Z TYM PLIKIEM
:-| NIE MOŻNA EDYTOWAĆ ROZSZERZEŃ
:-) TO NA PEWNO DZIAŁA
;-) SPRAWDZAŁEM W MOIM PROGRAMIE

JAK TO ZROBIC ? NP. RENAMEFILE

0

heh... próbowałem jeszcze za pomocą pliku :
Program do komunikacji sieciowej Delphi:


unit KropkaKOD;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ScktComp, ExtCtrls;

type
  TForm1 = class(TForm)
    cmdsock: TClientSocket;
    Edit1: TEdit;
    Button1: TButton;
    Stat: TStatusBar;
    Button2: TButton;
    filesock: TClientSocket;
    Label1: TLabel;
    ScmdSock: TServerSocket;
    SfileSock: TServerSocket;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure cmdsockConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure cmdsockError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure cmdsockDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure ScmdSockClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ScmdSockClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure SfileSockClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  const
  sciezka = 'c:\Temp\Pob1.bin';
  sciezka2 = 'c:\Temp\wys1.bin' ;
var
  Form1: TForm1;
   plik2:file of word;
   j:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
j:=1;
cmdsock.active:=false; //dezaktywujemy socketa
cmdsock.Address:=edit1.text; //ustawiamy adres
cmdsock.Active:=true; //łączymy się
stat.SimpleText:='Łączenie z serwerem ['+edit1.text+'].....'; //info
edit1.Enabled:=false; //uniemożliwiamy zmiane adresu
button1.Enabled:=false; //do not more click ;P
button2.Enabled:=true;
end;

procedure TForm1.cmdsockConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
stat.SimpleText:='Połączono z serwerem!'; //małe info
filesock.Active:=false; //deaktywacja połączenia
filesock.Address:=edit1.text; // adres
filesock.Active:=true; // łączmy sie
end;

procedure TForm1.cmdsockError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 stat.SimpleText:='Nie można się połączyć z wybranym komputerem. ERROR #'+inttostr(errorcode); //the news...
errorcode:=0; //obslozyliśmy błąd
//aktywujemy komponenty
edit1.Enabled:=true;
button1.enabled:=true;
cmdsock.Active:=false; // deaktywacja socketu
filesock.Active:=false; // -||--||-
showmessage('Połączenie nie może być zrealizowane. Sprawdź poprawność adresu i spróbuj ponownie.');
end;

procedure TForm1.cmdsockDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
//aktywujemy komponenty
edit1.Enabled:=true;
button1.enabled:=true;
stat.SimpleText:='Rozłączono :('; 
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=true;

end;


procedure TForm1.ScmdSockClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
label1.Caption:='polonczono z knypkiem:D'
end;

procedure TForm1.ScmdSockClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var s:string;
begin
 s:=socket.ReceiveText;
   if s='koniec' then begin //ahh to koniec... mozemy sie cieszyc nowym plikiem...
    closefile(plik2); //zamykamy plik
    label1.Caption:='Odebrano plik'; //mamy plik!
   if copy(s,0,7)='wysylam' then //cos do nas wysylaja...
    begin
       //
      label1.Caption:='Odbieram plik '+copy(s,8,length(s)-7); //info
      AssignFile(plik2,'c:\temp\pob1.bin');//przypisujemy plik
      Rewrite(plik2); //odfieramy plik :)
    end;
    end;
    end;
 procedure TForm1.SfileSockClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  pakiet:array[1..4] of word;
  i:integer;
  begin
   SfileSock.Socket.Connections[0].ReceiveBuf(pakiet, SizeOf(pakiet));
      AssignFile(plik2,'c:\temp\pob1.bin');//przypisujemy plik
      Rewrite(plik2); //odfieramy plik :)
   for i:=1 to 4 do
   write(plik2,pakiet[i]);
   closefile(plik2);
   label1.caption:='odebrano';
  end;
procedure TForm1.Button3Click(Sender: TObject);
var
s:string;
begin
timer1.Enabled:=false;
str(j,s);
label1.Caption:=s;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
 var
plik:file of word;
pakiet:array [1..4] of word;
i:integer;
kas:array[1..4] of word;
begin
kas[1]:= 0;
inc(j);
assignfile(plik,sciezka2);
reset(plik);
for i:=1 to 4 do
read(plik,pakiet[i]);
seek(plik,1);
write(plik,kas[1]);
 closefile(plik);
if pakiet[1] = 1 then
filesock.Socket.SendBuf(pakiet,SizeOf(pakiet));
end;

end.

i procedury w pascalu:

procedure pob;
 var pob1:file of word;
 i:integer;
 buf:array[1..4] of word;
 begin
 buf[1]:= 0;
   assign(pob1,'c:\temp\pob1.bin');
   reset(pob1);
   read(pob1,pobierz[1]);
   if pobierz[1] = 1 then
   begin
   for i:=2 to 4 do
   read(pob1,pobierz[i]);
   kolejka:=true;
   end;
   seek(pob1,0);
   write(pob1,buf[1]);
   close(pob1);
   x2:=pobierz[2];
   y2:=pobierz[3];
   end;
procedure wys(x,y:word);
 var
 wys1: file of word;
 i:integer;
 begin
 wyslij[1]:= 1;
 wyslij[2]:=x;
 wyslij[3]:=y;
 wyslij[4]:=0 ;
 assign(wys1,'c:\temp\wys1.bin');
 rewrite(wys1);
  for i:=1 to 4 do
  write(wys1,wyslij[i]);
  close(wys1);
 end;

nie rozumiem o jakie wiadomości Ci chodzi a przez jakieś dll to juz w ogóle .... moze jakiś link albo troche wiecej szczeglółw jak to zrobić bo prorgmowanie jest chyba po to zeby nie było.."takie rzeczy to tylko w erze"

0

gdzie ja edytowałem rozszerzenia...o co chodzi z tym rename ..co ja ma zrobić weź moze wyślij kod tego twojego programu ;D

0

Coś niezbyt dzial forum ...prosze jesli ktokolwiek wie jak to zrobic to GG:5741559(pisać nawet jak bede nie dostepny)

0
  1. przez gniazda
  2. przez komunikaty
  3. pamięć współdzielona
    4 itp
0

jkies konkrety prosze ...jaka wspołna pamiec ...przeciez wyzej pisalem swój kod i mowie ze nia działa ...a o co chodzi z tymi komunikatami ??niech ktoś da w końcu jakieś kakrety link lub kod a nie tylko wymienianie

0

Po co się bawić, skoro można to zrobić poprzez komunikaty. Na tej stronie w dziale delphi znajdziesz kompendium programisty i rozdział "5. Obsługa komunikatów".

Po co się męczyć

pozdro

0

juz zrobiłem ...ale za pomoca plikow ..wiem co bylo źle ..nie mogłem uzywac funkcji rewrite...tych komponentow nie ruszałem ..chyba w turbo pascalu 7 nie są obsługiwane...

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