Results 1 to 14 of 14

Thread: Versturen van gegevens via messages tussen twee programma's

  1. #1
    kuntao
    Guest

    Question Versturen van gegevens via messages tussen twee programma's

    Hallo ,

    Ik wil graag gegevens versturen tussen twee programma's ,
    m.b.v. messages.

    Ik heb 1 programma dat een stylesheet editor is die zowel los en als een
    plugin moet kunnen werken met een ander programma's

    vanuit 1 programma waarin ik bijvoorbeeld een pagina met links wil maken
    die moet de stylesheet editor aanroepen.

    de stylesheet editor die moet de filenaam van de bijbehorende data bestand
    ontvangen en vervolgens gegevens terug sturen die bij dat bestand horen,
    (de data bestand resource code , lijst met class namen v/d stylesheet en een
    bevestiging of het process goed is verlopen).

    Het versturen van reply door de stylesheet editor gaat als volgt

    Code:
     Const Plugin_Prg_Name = 'Test';
           Plugin_Prg_Classname = 'TdlgTest';
     
     const MSG_REPLY     = WM_USER + 4040;
    
     Procedure msgReply_Accept;
     Begin
      ReplyMsg(Plugin_Prg_Name,Plugin_Prg_Classname,'Accepted');
     End;
    
     procedure ReplyMsg(Name,Classname,Msg:String);
     var Hw:Hwnd;
     begin
      hw := findwindow(pchar(classname),pchar(name));
      SendMessage(Hw,MSG_REPLY, 0, DWORD(PCHAR(Msg)));
     end;
    Vervolgens moet het andere programma de gegevens ontvangen.

    Code:
    type
      TdlgTest = class(TForm)
      private
      public
       procedure MessageReceiver(var msg: TMessage); message MSG_REPLY;
      end;
    
    ..........
    
    procedure TdlgTest.MessageReceiver(var msg: TMessage);
    var txt: PChar;
    begin
      txt := PChar(msg.lParam);
      ShowMessage(txt);
    end;

    Opzich werkt dit wel , maar de ontvangende programma
    hoort dus in deze voorbeeld de text te ontvangen 'accepted' en dan
    in de showmessage weer te geven , maar de txt blijft hier leeg.

    Weet iemand wat ik fout doe of een andere oplossing ?

    alvast bedankt , kuntao

  2. #2
    kylix 3 and delphi 6 user Viper's Avatar
    Join Date
    Apr 2002
    Posts
    511
    Komt hij wel in de Messagereceiver procedure ?

  3. #3
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Volgens mij heb ik zelf ook nogal eens problemen gehad met strings oversturen tussen applicaties. Alhoewel m'n kennis van het gehele systeem toen minder was en ik misschien ook een klein foutje heb gemaakt heb ik wel een andere werkende oplossing gevonden: een Memory Mapped File maken en de handle daarvan doorsturen in de message. In feite is het zelfs logischer: je maakt dan een gedeeld stukje geheugen aan die door beide applicaties probleemloos kan worden uitgelezen...


    Voor een memory mapped file: kijk eens naar de CreateFileMapping/MapViewOfFile API's...



    ...er zijn ongetwijfeld nog meer technieken, en heb ze niet allemaal uitgeprobeerd (omdat mijn huidige plugins e.d. gewoon via interfaces werken en dus direct communiceren ), maar deze werktte toen in ieder geval...
    Qui custodiet ipsos custodes

  4. #4
    kuntao
    Guest
    Hallo ,

    Ja de messagereciever reageerd prima , alleen de txt blijft leeg.

    groeten

  5. #5
    kylix 3 and delphi 6 user Viper's Avatar
    Join Date
    Apr 2002
    Posts
    511
    @ Psychomark

    Je hebt gelijk, ik had het zelfde probleem en heb het ook op die manier opgelost.

    Ik heb hier nog wel een vb'tje liggen, zal ik zo even posten als je er belangstelling voor hebt Haal ik 'm zo even uit mijn programma waar hij in zit, enigszins aangepast...

  6. #6
    kuntao
    Guest

    Thumbs up

    Ja als je et 'zal willen posten , kan ik weer wat kennis vergaren

    grtzz

  7. #7
    kylix 3 and delphi 6 user Viper's Avatar
    Join Date
    Apr 2002
    Posts
    511
    Ik hoop dat ik alles heb

    Code:
    const
      TheMappingConstant = 'MappingConstant';
    
    private
      MapHandle : THandle;
    
    // retourneert een unieke maphandle voor de messages
    function TForm1.ObtainMappingHandle : Thandle;
    begin
      Result := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,LengteInfo,TheMappingConstant);
    
      if Result <> 0 then
        if GetLastError = ERROR_ALREADY_EXISTS then
          begin
          CloseHandle(Result);
          Result := OpenFileMapping(FILE_MAP_WRITE,False,TheMappingConstant);
          end;
      end;
    end;
    
    procedure TForm1.FormCreate(Sender:TObject);
    begin
      MapHandle := ObtainMappingHandle;
    end;
    
    procedure TForm1.FormDestroy(Sender:TObject);
    begin
      CloseHandle(MapHandle);
    end;
    
    procedure TForm1.MessageReceiver(var msg: TMessage);
    var txt: PChar;
    begin
      if MapHandle <> 0 then
      begin
        P_Info := MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);
        txt := P_Info;
        ShowMessage(txt);
        unmapViewOfFile(P_Info);
      end;
    end;
    Je moet in beide applicaties dus dezelfde map maken. Kijk 's of je er uit komt en laat het dan even weten

    Succes !!

    Peter

  8. #8
    kuntao
    Guest

    Thumbs up

    Hallo

    bedankt , ik zal er es ff naar kijken.

    groeten kuntao

  9. #9
    Registered User
    Join Date
    Feb 2002
    Location
    Arnhem
    Posts
    15
    Het idee met messages is wel goed, maar je moet hier niet proberen er een string mee over te gooien. ALs je nou de string in de GlobalAtomTable gooit... "GlobalAddAtom(Value: PChar)" en de Atom die je terug krijgt met de message mee geeft. De ontvanger kan dan met de ontvangen Atom, gebruik makend van "GetAtomName", de string weer uitlezen...

    Werkt perfect!

  10. #10
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Een nadeel van atoms echter:


    The string associated with a string atom can be no more than 255 bytes in size. This limitation applies to all atom functions.
    Qui custodiet ipsos custodes

  11. #11
    kuntao
    Guest

    Wink

    Hallo,

    "
    The string associated with a string atom can be no more than 255 bytes in size. This limitation applies to all atom functions.
    "

    De Atom houd dan zowie zo al op bij mij , want ik wil
    een resource code meeversturen die is zowiezo meer dan 255 bytes.
    (componenttostring) .

    Het andere zal ik strax ff uitoeken.

    Grtzz Kuntao

  12. #12
    kuntao
    Guest
    Hallo ,
    Ik heb ff gekeken naar het filemapping

    en het volgende heb ik

    Form die data moet versturen ,

    //////////////////////////////////////////////////////////////////////////////////////////////////////
    Code:
    const MSG_REPLY     = WM_USER + 4040;
           MSG_RESCODE   = WM_USER + 4041;
           MSG_CODE      = WM_USER + 4042;
           MSG_FILENAME  = WM_USER + 4043;
           MSG_TERMINATE = WM_USER + 4044;
           MSG_ACCEPT    = WM_USER + 4045;
    
     const TheMappingConstant = 'mapping web editor';
    
     const msgClassName = 'TStyleSheetEd';
           msgName = 'Style Sheet Editor';

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,idMessage, StdCtrls, Spin;
    
    type
      TdlgTest = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        function  ObtainMappingHandle : Thandle;
      private
        LengteInfo:Cardinal;
        MapHandle : THandle;
      public
      end;
    
    var
      dlgTest: TdlgTest;
    
    implementation
    
    {$R *.dfm}
    
    function TDlgTest.ObtainMappingHandle : Thandle;
    begin
      LengteInfo := 4048;
      Result :=  CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,LengteInfo,TheMappingConstant);
      if Result <> 0 then
      begin
       if GetLastError = ERROR_ALREADY_EXISTS then
       begin
        CloseHandle(Result);
        Result :=  OpenFileMapping(FILE_MAP_WRITE,False,TheMappingConstant);
       end;
      end;
    end;
    
    procedure TdlgTest.Button1Click(Sender: TObject);
    var h:Hwnd;
    begin
     h := findwindow(msgClassName,msgName);
     SendMessage(H,MSG_REPLY, 0, DWord(pchar('moi')));
    end;
    
    procedure TdlgTest.FormCreate(Sender: TObject);
    begin
     MapHandle := ObtainMappingHandle;
    end;
    
    procedure TdlgTest.FormDestroy(Sender: TObject);
    begin
     CloseHandle(MapHandle);
    end;
    //////////////////////////////////////////////////////////////////////////////////////////////////////
    En de andere form soort gelijke.

    Code:
    procedure TStyleSheetEd.MsgReply(var msg: TMessage);
    var txt: PChar;
        P_Info:Pointer;
    begin
      if MapHandle <> 0 then
      begin
        P_Info := MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);
        txt := P_Info;
        ShowMessage(txt);
        unmapViewOfFile(P_Info);
      end else beep;
    end;
    
    function TStyleSheetEd.ObtainMappingHandle : Thandle;
    begin
      Lengteinfo := 4048;
      Result :=  CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,LengteInfo,TheMappingConstant);
      if Result <> 0 then
      begin
       if GetLastError = ERROR_ALREADY_EXISTS then
       begin
        CloseHandle(Result);
        Result :=  OpenFileMapping(FILE_MAP_WRITE,False,TheMappingConstant);
       end;
      end;
    end;
    //////////////////////////////////////////////////////////////////////////////////////////////////////

    Zoals met de MsgReply gaat wel ok ,
    maar hoe schrijf en lees ik dat weg/in met behulp van de filemapping?

    Lengteinfo heb ik maar een bepaalde waarde gegeven , of dat juist is weet ik niet.
    en P_Info ben ik maar vanuit gegaan dat een pointer is.

    Maar ben met filemapping nog nie zo bekend en de help word ik nie veel wijzer uit.

    Groeten Kuntao

  13. #13
    kylix 3 and delphi 6 user Viper's Avatar
    Join Date
    Apr 2002
    Posts
    511
    Hoi Kuntao !!

    Hier kan je vast verder mee...


    -- verzenden --

    Code:
    var
      P_info : pchar; :)
    begin      
       P_Info := MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);   
       StrPLCopy(P_Info,'jouw info/text',LengteInfo);
       SendMessage(HandleNaarApplicatie,MessageID,0,0);
       unmapViewOfFile(P_Info);
    end;

    -- ontvangen --

    Code:
    var                    
      P_Info :Pchar;
      ontvangentext : string;
    begin
       if MapHandle <> 0 then  
       begin
          P_Info := MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);              
          OntvangenText:=P_Info;          // alle info staat nu hierin
          unmapViewOfFile(P_Info);
        end;
    end;

    Groeten,

    Peter

  14. #14
    kuntao
    Guest

    Thumbs up

    Hallo

    Bedankt het werkt

    Groeten Kuntao

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Replies: 67
    Last Post: 15-Jun-04, 12:32

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •