Exe'den Exe'ye veri aktarımı...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Exe'den Exe'ye veri aktarımı...

Mesaj gönderen Biltes »

Arkdaşlar merhaba;

Programıma yeni bir şeyler ekliyorum ama bir yere geldim yine takıldım. Sorun şu; d5'te yaptığım bir projem var bu projede bulunan tckimlik alanına d7'de yapılan bir tcno sorgulama programından benim programımdaki d5'te yaptığım programımın içindeki formun bir edit'ine o çıkan tckimlik sonucunu aktarmak istiyorum bir buton yardımı ile olabilir yada başka bir şekilde. Bunu nasıl sağlayabilirim acaba.

Bu arada yazmayı unuttum d7'deki o exe'yi kendi programım içerisinden çağırıcam...

Yardımlarınız için şimdiden çok tşk ediyorum. Arkdaşlar...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

S.A.

Çözüm karakter gönderme olabilir;
NotPad'e karakter gönderen fonksiyon bu, biraz oynarsan işine yarayabilir.

Kod: Tümünü seç

var 
  g,d:integer;
begin
 {uygulamanın ana penceresini bul}
 g:=FindWindow('Notepad',nil);

 {uygulama penceresindeki text box'ı bul}
 d:=ChildWindowFromPoint(g,point(50,50));

 {karakteri gönder}
 SendMessage(d,WM_CHAR,Ord('A'),0);
end;
(kodlar ç-alıntıdır.)

Kolay gelsin.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkadaşlar bu olayı delphi5'te denedim ama HTTPROI bileşeni olmadığı için olmuyor bu çeşit bir sorgulamayı delphi5'te nasıl yapabiliriz.
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
ikut

Re: Exe'den Exe'ye veri aktarımı...

Mesaj gönderen ikut »

Biltes yazdı:Arkdaşlar merhaba;

Programıma yeni bir şeyler ekliyorum ama bir yere geldim yine takıldım. Sorun şu; d5'te yaptığım bir projem var bu projede bulunan tckimlik alanına d7'de yapılan bir tcno sorgulama programından benim programımdaki d5'te yaptığım programımın içindeki formun bir edit'ine o çıkan tckimlik sonucunu aktarmak istiyorum bir buton yardımı ile olabilir yada başka bir şekilde. Bunu nasıl sağlayabilirim acaba.

Bu arada yazmayı unuttum d7'deki o exe'yi kendi programım içerisinden çağırıcam...

Yardımlarınız için şimdiden çok tşk ediyorum. Arkdaşlar...
paramcount ve param str ile komut satırından zahmetsizce veri aktarabilirsin.
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Bir firebird vt kullanıp ib events ile olabilir.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

txt neden olmasın ki :lol:
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Arkadaşların önerdiği çözümler belki uygulanabilir, ama hepsinde de ufak tefek de olsa sıkıntılar var.

@ulu coder
Aslında en uygun çözüm bu, ama Edit kutusunun yerini değiştirdiğinizde (programda değişiklik yaptığınızda) her iki programı da güncellemeniz gerekiyor. Anlayacağınız genel bir çözüm değil.

@ikut
Exe'nin ilk açılışı için uygun bir çözüm olabilir, ama çalışan bir exe için işe yaramayacaktır.

@shadowmann
Eğer program firebird kullanıyorsa olabilir, ama sırf bunun için projeye firebird eklemek hem doğru olmaz, hem de akıllıca.

Bence en uygun çözüm Windows Message Sistemini kullanmak. Windows'un buna benzer işlemler için tanımladığı bir mesaj yapısı var zaten. WM_COPYDATA. Aşağıda mesajı gönderecek olan programın kodlarını veriyorum.

Kod: Tümünü seç

procedure TForm1.btnGonderClick(Sender: TObject);
var
  CopyData:COPYDATASTRUCT;
  AText:string;
  AHwnd:HWND;
begin
  AText:='Gönderilmesi gereken metin';

  //Bir şekilde programın handle değerini bulman gerekiyor
  //Örnek olsun diye ulu coder'in kodunu yazıyorum
  AHwnd:=FindWindow('Programın',nil); 

  CopyData.dwData := 0;
  CopyData.cbData:=Length(AText) + 1;
  GetMem(CopyData.lpData, Length(AText) + 1);
  StrPCopy(PChar(CopyData.lpData), AText);

  SendMessage(AHwnd, WM_COPYDATA, Handle, Integer(@CopyData));

  FreeMem(CopyData.lpData);
end;
Burada dikkat edersen belirli bir programa WM_COPYDATA ile bilgi gönderdik. Şimdi de onu almaya geldi. Aşağıdaki kod da mesajı alan programa yazılmalıdır.

Öncelikle mesajı yakalayacak olan fonksiyonu tanımlayalım.

Kod: Tümünü seç

    procedure OnGetMessage(var Msg:TMessage);message WM_COPYDATA;
Şimdi de fonksiyonu yazalım.

Kod: Tümünü seç

procedure TForm2.OnGetMessage(var Msg: TMessage);
var
  CopyData:PCOPYDATASTRUCT;
  AHWND:HWND;
begin
  AHWND:=FindWindow('Mesaj Gönderen Program', nil);

  if (Msg.WParam = AHWND) then //Bu satırı test etmedim, cast yapman gerekebilir
  begin
    CopyData:=Pointer(Msg.LParam);
    ShowMessage(PChar(CopyData.lpData));
    Msg.Result:=1;
  end;
end;
WParam ile sana mesajı gönderen pencereyi kontrol ediyorsun, çünkü bu mesajı başka programlar da gönderebilir. O zaman senin mesajı işlememen gerekiyor.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Hocam cevaplarınız için herkese çok tşk ediyorum. Bahadır arkdaşımızın dediği gibi uyguladım ve sorun çözüldü herhangi bir değişikliğe gerek kalmadı. Canavar gibi yapıyor.

Helal olsun hocam... Hepiniz sağolasın...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Cevapla