Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Postmessage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
03.03.2004, 21:10 Uhr
~Rock
Gast


Hi,

ich habe mir eine Standard MFC-DLL erstellt. Dieser lasse ich nun von einer Anwendung ein Fensterhandle übergeben. Und nun möchte ich mit Hilfe von Postmessage eine Nachricht an die Anwendung schicken.
Leider bekomme ich die Fehlermeldung, dass PostMessage nur 3 Parameter akzeptiert. Dies ist wohl die MFC-Version der PostMessage Funktion. Bei dieser kann man kein Handle angeben. Aber es gibt auch eine PostMessage Funktion, bei der man das Fensterhandle als ersten Parameter mit angeben kann.

Wie kann ich die PostMessage Funktion mit 4 Parametern in der Standard MFC-DLL verwenden?
bzw.
Wie kann ich der PostMessage Funktion mit 3 Parametern mitteilen, dass die Nachricht an die Anwendung mit dem Fensterhandle xyz gesendet wird?

Danke

Rock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.03.2004, 07:46 Uhr
~mike
Gast


Hi!
Ich bin mir jetzt nicht ganz sicher, aber probier mal ::PostMessage. Imho hängt es immer davon ab, in welcher Klasse du Postmessage aufrufst. Eine CWnd abgeleietete Klasse hat immer 3 Params.

mfg

Dieser Post wurde am 04.03.2004 um 09:57 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.03.2004, 08:40 Uhr
~Rock
Gast


Vielen Dank Mike. Darauf wäre ich nicht gekommen und es funktioniert. Nun habe ich aber noch folgendes Problem. Ich möchte mit dieser Nachricht nun folgende Variableninhalte verschicken.

CString m_Wert1;
CString m_Wert2;

Diese möchte ich in lParam haben. In wParam möchte ich nur eine Zusatzinformation stecken. Das mit wParam funktioniert auch schon. Wie kann ich jetzt aber 2 Werte des Typs CString in lParam stecken?

Danke

Rock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.03.2004, 10:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


2x aufrufen, und je nach wparam dann den anderen Wert nehmen. Theoretisch könnte auch folgendes gehen:


C++:
struct Daten {
  CString Wert1;
  CString Wert2;
  Assign(CString a, CString b) { Wert1 = a; Wert2 = b; };
};

// ...

Daten data;
data.Assign(m_Wert1,m_Wert2);
::PostMessage(hWnd,wParam,(LPARAM)data);

//...

Daten data;
data = (Daten)lParam;




ggf sind noch einige Casts notwendig, kann das jetzt hier an diesem Rechner nicht testen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.03.2004, 10:49 Uhr
~Rock
Gast


Hi, erstmal Danke für deine Antwort. Die Grundidee habe ich verstanden. Ausprobiert habe ich es jetzt auch. Wie du schon sagtest, sind evtl. noch einige Casts notwendig.
Denn ich bekomme folgende Fehlermeldung:


Code:
error C2440: 'type cast' : 'struct Daten' kann nicht in long konvertiert werden.
Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator nicht aufgerufen werden.



Ich habe jetzt dann eine Weile rumprobiert. Weiß aber leider nicht, wie ich es casten muss, damit es funktioniert.
Über weitere Tipps würde ich mich freuen.

Gruß

Rock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.03.2004, 14:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Solang es das gleiche Programm (also nicht z.b an eine DLL übergeben wird) ist, kannst du Pointer verwenden:


C++:
struct Daten {
  CString Wert1;
  CString Wert2;
  Assign(CString a, CString b) { Wert1 = a; Wert2 = b; };
};

// ...

Daten *data = new Daten;;
data->Assign(m_Wert1,m_Wert2);
::PostMessage(hWnd,wParam,(LPARAM)&data);

//...

Daten *data;
data = lParam;

//Nach Benutzung:
delete data;


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.03.2004, 08:47 Uhr
~Rock
Gast


Danke für deine Antwort. Aber bei mir wird es leider an eine DLL übergeben. Aber ich habe jetzt auch eine Lösung gefunden, denke ich.


C++:
Daten data;
data.Assign(m_Wert1,m_Wert2);
::PostMessage(hWnd,wParam,(LPARAM)&data);

//empfangen der Nachricht
Daten sdata;
memcpy(&sdata,(void*)lParam,sizeof(sdata));




Was hältst du davon?
Ist die Lösung sauber oder nur hingetrickst?

mfg

Rock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.03.2004, 09:07 Uhr
~Rock
Gast


Naja, die Lösung scheint nicht gut zu sein. Sobald ich ein zweites Mal eine Nachricht schicken will bekomme ich einen Heapfehler. Beim ersten Mal klappt es aber.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.03.2004, 17:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


da sizeof(sdata) je nach größe von den CStrings anders groß ist, da aber sizeof zur compile-zeit ausgewertet wird geht das schief.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.03.2004, 15:54 Uhr
~Rock
Gast


Würde es dann funktionieren, wenn ich irgendwie die Länge der CStrings bzw. Anzahl Bytes ermitteln würde und diese dann der memcpy-Funktion übergeben würde?

Danke

Rock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: