Toon posts:

c++ Berichten sturen tussen applicaties

Pagina: 1
Acties:

Verwijderd

Topicstarter
In c++ wil ik een bericht sturen tussen twee applicaties, volgens mij ben ik er na lang zoeken bijna.
Het werkt alleen nog niet, volgens mij zie ik iets over het hoofd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Main.h>
public:
    virtual void __fastcall WndProc( TMessage &Message);

<Main.cpp>
#define WM_MYMESSAGE WM_APP+400

//---------------------------------------------------------------------------
void __fastcall TMainForm::WndProc( TMessage &Message)
{
    if ( Message.Msg == WM_MYMESSAGE ){
        ShowMessage("App nog een keer gestart");
        return;
    }
    inherited::WndProc( Message);
}
//---------------------------------------------------------------------------


En om berciht te sturen gebruik ik deze regel, hMySecondProcess=proces van applicatie die bericht moet ontvangen
code:
1
SendMessage(hMySecondProcess,WM_MYMESSAGE, 0, LPARAM(PChar("TEST BERICHT")));

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wát werkt er niet? Dat kunnen we natuurlijk niet raden.

Nou, eigenlijk, dat kan ik wel: ik vermoed dat je LPARAM naar bogus info wijst? Nogal logisch, je geeft een pointer naar data in je ene process. Op datzelfde adres in het andere proces staat natuurlijk heel andere data. Je moet je string dus marshallen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op woensdag 27 juni 2007 @ 18:23:
Wát werkt er niet? Dat kunnen we natuurlijk niet raden.

Nou, eigenlijk, dat kan ik wel: ik vermoed dat je LPARAM naar bogus info wijst? Nogal logisch, je geeft een pointer naar data in je ene process. Op datzelfde adres in het andere proces staat natuurlijk heel andere data. Je moet je string dus marshallen.
Met het bericht doe ik nog niks, ik vergelijk op 'WM_MYMESSAGE' en die zou overeen moeten komen.
Na een test met de debug aan wordt 'WndProc' in beide applicaties niet aangeroepen na het uitvoeren van 'SendMessage'

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is hMySecondProcess dan? De naam lijkt aan te geven dat het om een process handle gaat, niet een window handle.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op woensdag 27 juni 2007 @ 18:28:
Wat is hMySecondProcess dan? De naam lijkt aan te geven dat het om een process handle gaat, niet een window handle.
Hier is de volledige code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    PROCESSENTRY32 ppe = {0};
    ppe.dwSize = sizeof (PROCESSENTRY32);

    HANDLE hSnapShot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    if (Process32First (hSnapShot, &ppe))
    {
        do
        {
            if (!stricmp ("tconnect.exe", ppe.szExeFile) && (ppe.th32ProcessID != GetCurrentProcessId ()))
            {
                HANDLE hMySecondProcess = OpenProcess (PROCESS_TERMINATE, FALSE, ppe.th32ProcessID);
                if (hMySecondProcess)
                {
                    //postmessage naar open tconnect applicatie
                    //PostMessage(hMySecondProcess, WM_MYMESSAGE, 0, 0L);
                    SendMessage(hMySecondProcess,WM_MYMESSAGE, 0, LPARAM(PChar("Hello World")));
                    //einde post bericht

                    ShowWindow(hMySecondProcess, SW_SHOWMAXIMIZED);
                    SetForegroundWindow(hMySecondProcess);
                    Application->Terminate();
                    //TerminateProcess (hMySecondProcess, 0);
                    //CloseHandle (hMySecondProcess);
                }
            }
        }while (Process32Next (hSnapShot, &ppe));
    }
    CloseHandle (hSnapShot);

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoals ik al zei. Waarom loop je een process handle te behandelen alsof het een window handle is?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op woensdag 27 juni 2007 @ 18:30:
Zoals ik al zei. Waarom loop je een process handle te behandelen alsof het een window handle is?
Ik moet dus de windows-handler meegeven en niet de process-handler
Weet jij zo een regel die ik kan gebruiken, anders zoek ik zelf even met google.
Als vast bedank voor de informatie, hier was ik zelf niet achter gekomen

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op woensdag 27 juni 2007 @ 18:34:
[...]


Ik moet dus de windows-handler meegeven en niet de process-handler
Een handle, niet een handler, da's wat anders ;). Maar als je de documentatie van de functies die je aanroept had gelezen, dan had je dat zelf ook geweten: SendMessage en SetForegroundWindow etc. verwachten een HWND. OpenProcess() geeft een HANDLE terug. :)
Weet jij zo een regel die ik kan gebruiken, anders zoek ik zelf even met google.
Je zou met FindWindow() de juiste window kunnen zoeken ipv alle processen langs te gaan. EnumWindows() zou je ook kunnen gebruiken, die loopt over alle top-level windows zodat je zelf je zoekcriteria kunt programmeren.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1