[c++] doorgeven van strings aan applicatie mbv PostMessage

Pagina: 1
Acties:

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 22-08 20:14
Ik heb in Builder 6 een applicatie gebouwd die vanuit een andere applicatie een aantal strings moet ontvangen. Dit wil ik doen mbv de functie Postmessage.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::HandleChangeLabel(TMessage& msg)
{
 String Tekst(msg.LParam);
 switch (msg.WParam){
 case 1:
        Label1->Caption = Tekst;
        break;
 case 2:
        Label2->Caption = msg.LParam;
        break;
 case 3:
        Label3->Caption = msg.LParam;
        break;
 case 4:
        Label4->Caption = msg.LParam;
        break;
 default:
        Application->MessageBoxA("Unknown Label", "Error", MB_OK);
 }
}
Als ik deze code gebruik, krijg ik in LParam een pointer naar een string door. Het lukt mij echter niet om deze pointer in een integer waarde zo te gebruiken dat ik de tekst in een label krijg. Ik krijg nu de waarde van de integer in het label. Casten naar een characterpointer heeft ook niet het gewenste effect.

Iemand een idee hoe ik dit wel voor elkaar kan krijgen?

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Misschien (char *) *msg.LParam; of *((char *) msg.LParam)); is misschien beter?

[ Voor 42% gewijzigd door SWfreak op 14-05-2003 12:15 ]


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 22-08 20:14
De eerste compiled in ieder geval niet: invalid indirection.
Bij de tweede staat er geen tekst meer in het label.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Je kunt niet zomaar string pointers tussen applicaties uitwisselen, elke applicatie draait in z'n eigen address space en zo'n pointer zou dus in een andere applicatie ongeldig kunnen zijn of iets compleet anders aanwijzen. Je kunt WM_COPYDATA gebruiken om data uit te wisselen tussen applicaties met messages.

www.madwizard.org


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Tweede zou wel het goede moeten zijn.
Ik twijfel er sowieso aan of dit te doen is. Aan de gepostte message wordt neem ik aan een pointer naar een char array meegegeven? Dit zal sowieso niet werken omdat die pointer waarschijnlijk lokaal is aan de heap van de postende applicatie. Misschien moet je eens naar de GlobalAlloc functie kijken en de daaruit geretourneerde pointer doorgeven. Dan staat de data op de globale heap ipv de lokale. Dat zou misschien kunnen helpen...

Edit: oplossing van MadWizard lijkt me een stukje netter. Zo leer ik ook nog eens wat :)

[ Voor 9% gewijzigd door SWfreak op 14-05-2003 12:31 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

SWfreak schreef op 14 May 2003 @ 12:29:
Tweede zou wel het goede moeten zijn.
Ik twijfel er sowieso aan of dit te doen is. Aan de gepostte message wordt neem ik aan een pointer naar een char array meegegeven? Dit zal sowieso niet werken omdat die pointer waarschijnlijk lokaal is aan de heap van de postende applicatie. Misschien moet je eens naar de GlobalAlloc functie kijken en de daaruit geretourneerde pointer doorgeven. Dan staat de data op de globale heap ipv de lokale. Dat zou misschien kunnen helpen...
Global en local heap zijn een overblijfsel van 16-bit windows, in win32 is er geen verschil meer tussen, er is alleen een local heap. GlobalAlloc en LocalAlloc gebruiken uiteindelijk gewoon HeapAlloc.

www.madwizard.org


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik vind WM_COPYDATA ook een nogal vies mechanisme dat uitnodigt tot misbruik en fatale fouten. Nette methodes om data van varierend formaat tussen 2 gerelateerde applicaties rond te laten zingen zijn anonymous pipes en in mindere mate mailslots. Zie MSDN online voor docs over die 2 IPC-mechanismes.

Professionele website nodig?


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 22-08 20:14
Ik ga dan maar WM_COPYDATA gebruiken. Aangezien de zendende applicatie een stuk code draaiend onder Lotus Notes is zal ik maar geen pipes e.d. gaan gebruiken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

peetman: dat snap ik niet helemaal. Dus omdat het onder Lotus Notes draait kun je geen anonymous pipes gebruiken? Waarom dan niet?

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.


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 22-08 20:14
Ik zeg niet dat het niet kan. Ik bedoel alleen te zeggen dat ik me niet kan voorstellen dat pipes makkelijk te implementeren zal zijn in lotusscript.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Vergeet shared memory en TCP/IP naar 127.0.0.1 niet.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Shared memory (oftewel memory mapped files) zijn niet handig omdat je ze niet kunt streamen. TCP is veel meer overhead dan pipes (discussie hebben we eerder gehad ;) ) en bovendien wordt een anonymous pipe direct tussen 2 gerelateerde applicaties gedeeld waardoor er geen afluisterrisico is zoals een TCP port (waar iedereen, bij een slechte firewall zelfs vanuit internet, aan kan connecten).

Voor een 1-op-1 relatie tussen 2 processen op per definitie 1 computer is de anonymous pipe het IPC mechanisme omdat het de hoogste snelheid en security levert.

Professionele website nodig?


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
(waar iedereen, bij een slechte firewall zelfs vanuit internet, aan kan connecten).
Niet als je bind naar 127.0.0.1

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Blijft een security leak zolang iedere lokaal draaiend programma eraan kan.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik zeg niet dat het niet kan. Ik bedoel alleen te zeggen dat ik me niet kan voorstellen dat pipes makkelijk te implementeren zal zijn in lotusscript.
Hier ben je me toch even kwijt... Je bedoelt dat het platform-independent Lotus Notes scripttaaltje wel support heeft voor Windows-native message queues?

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja ik vond het ook maar een vage redenering :?

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.


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 22-08 20:14
curry684 schreef op 15 May 2003 @ 11:27:
[...]

Hier ben je me toch even kwijt... Je bedoelt dat het platform-independent Lotus Notes scripttaaltje wel support heeft voor Windows-native message queues?
In LotusScript kan je gewoon Windows dll's aanroepen en daarmee dus ook de gehele WinApi. Ik ben mij er van bewust dat het gebruik van Pipes dan net zo goed te implementeren is.
Het probleem is wel dat ik het geheel niet te ingewikkeld wil maken. Daarom gebruik ik nu een ini file om wat info door te geven.
De notes-'applicatie' en het c++ progje hoeven niet gesynchroniseerd te worden. Bij nader inzien bleken dus ook die windows messages niet noodzakelijk.
Pagina: 1