11 Agustus 2011

#1 Bagaimana Kirim Informasi (String, Gambar, Rekam) Antara Dua Aplikasi

  Ada banyak pilihan ketika Anda perlu untuk memungkinkan dua aplikasi untuk berkomunikasi. Jika Anda tidak ingin main dengan soket TCP dan komunikasi (karena kedua aplikasi yang berjalan pada mesin yang sama), Anda dapat  *simply* mengirim (dan benar menerima) sebuah pesan Windows khusus: WM_COPYDATA.

Karena penanganan pesan Windows dalam Delphi sederhana, menerbitkan API SendMessage panggilan bersama dengan WM_COPYDATA diisi dengan data yang akan dikirim cukup lurus ke depan.
WM_COPYDATA dan TCopyDataStruct
Pesan WM_COPYDATA memungkinkan Anda untuk mengirim data dari satu aplikasi ke aplikasi lainnya. Aplikasi menerima menerima data dalam catatan TCopyDataStruct. TCopyDataStruct didefinisikan di unit Windows.pas dan membungkus struktur COPYDATASTRUCT yang berisi data yang akan berlalu.

Berikut deklarasi dan deskripsi dari catatan TCopyDataStruct:


    type
    TCopyDataStruct = packed record
    dwData: DWORD; //up to 32 bits of data to be passed to the receiving application
    cbData: DWORD; //the size, in bytes, of the data pointed to by the lpData member
    lpData: Pointer; //Points to data to be passed to the receiving application. This member can be nil.
    end; 

Kirim String atas WM_COPYDATA
Untuk aplikasi "Pengirim" untuk mengirim data ke "Penerima" CopyDataStruct harus diisi dan diteruskan menggunakan fungsi SendMessage. Berikut adalah cara untuk mengirim nilai string dari WM_COPYDATA:

      

     procedure TSenderMainForm.SendString() ;
     var
     stringToSend : string;
     copyDataStruct : TCopyDataStruct;
     begin
     stringToSend := 'About Delphi Programming';

     copyDataStruct.dwData := 0; //use it to identify the message contents
     copyDataStruct.cbData := 1 + Length(stringToSend) ;
     copyDataStruct.lpData := PChar(stringToSend) ;

     SendData(copyDataStruct) ;
     end; 

SendData menempatkan fungsi kustom penerima menggunakan panggilan FindWindow API:



    procedure TSenderMainForm.SendData(const copyDataStruct: TCopyDataStruct) ;
     var
       receiverHandle : THandle;
       res : integer;
     begin
       receiverHandle := FindWindow(PChar('TReceiverMainForm'),PChar('ReceiverMainForm')) ;
       if receiverHandle = 0 then
       begin
         ShowMessage('CopyData Receiver NOT found!') ;
         Exit;
       end;

      res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct)) ;
     end;

Pada kode di atas, "Receiver" aplikasi ditemukan menggunakan panggilan FindWindow API dengan melewatkan nama kelas form utama ("TReceiverMainForm") dan keterangan dari jendela ("ReceiverMainForm").


Catatan  : SendMessage mengembalikan sebuah nilai integer yang diberikan oleh kode yang menangani pesan WM_COPYDATA.
Penanganan WM_COPYDATA - Menerima String
The "Receiver" aplikasi menangani mesage WM_COPYDATA seperti dalam:




     type
     TReceiverMainForm = class(TForm)
    private
     procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
     ...
     implementation
     ...
     procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData) ;
     var
     s : string;
     begin
     s := PChar(Msg.CopyDataStruct.lpData) ;

    //Kirim sesuatu kembali


     msg.Result := 2006;
     end; 

    Catatan TWMCopyData dinyatakan sebagai  :

     TWMCopyData = packed record
    Msg: Cardinal;
     From: HWND;//Handle of the Window that passed the data
     CopyDataStruct: PCopyDataStruct; //data passed
     Result: Longint;//Use it to send a value back to the "Sender"
     end;
















1 komentar: