![]() |
Rückgabewert der Sendmessage funktion
Moin!
Ich habe hier eine DLL in mein Programm eingebunden und diese soll mit meinem Hautpprogramm per IPC kommunizieren, es funktioniert auch soweit, dass das Programm die Messages empfängt und auswerten kann nur kann ich aus dem Hauptprogramm heraus keine Result setzen, bzw. es dann in der DLL nicht auswerten. Ich habe keine Ahnung wieso und da die Materie für mich noch relativ neu ist, dachte ich mir, ich frage euch einfach mal um Rat. Achja, die Forensuche habe ich schon bemüht, doch die Lösungen aus den ~20 Threads scheinen bei mir nicht zu funktionieren. Ein bischen Code: Die deklarationen:
Delphi-Quellcode:
Mainprog. Code:
const
// Define the Message itself WM_AZURA_IPC = WM_USER + 4242; // Define the possible Values IPC_AZURA_QUIT = 0; IPC_AZURA_GETVERSION = 1;
Delphi-Quellcode:
Dll-Code
procedure IPCMessageHandler(AMsg: TMessage);
begin if AMsg.msg = WM_AZURA_IPC then begin case AMsg.WParam of IPC_AZURA_QUIT: FrmMainAzura.Close; IPC_AZURA_GETVERSION: AMsg.Result := DWORD(PChar('Foo')); end; end; end;
Delphi-Quellcode:
Ich hoffe ihr könnt mir helfen
function Create(AHandle: HWND): Bool; export;
begin ShowMessage(PChar(SendMessage(AHandle, WM_USER + 4242, 1, 0))); // FEHLER: Showmessage ist leer. SendMessage(AHandle, WM_USER + 4242, 0, 0); // Funktioniert! Main-Prog wird geschlossen end; Gruß, Max |
Re: Rückgabewert der Sendmessage funktion
Du kannst so einfach keine Zeichenketten über IPC verschicken.
Dein Pchar ist ja nur ein Zeiger. Den sendest du auch, aber in dem anderen Prozess, wo das Result (also der Zeiger auf 'Foo' ankommt, kann 'Foo' nicht gelesen werden, da du dich in zwei verschiedenen Adressräumen befindest. Also ein Pointer oder PChar in Prozess 1 zeigt auf eine ganz andere reale Adresse als derselbe Pointer in Prozess 2. Du hast nur 32 bit (also 4 Bytes) zum versenden. Demzufolge würde sogar ein 'Foo' reinpassen, nur anders als du es gemacht hast. du darfst nicht den Zeiger versenden, sondern den Inhalt des Zeigers. Längere Zeichenketten gehen allerdings nicht mehr. Für Zeichenketten versenden bieten sich generell "global Atoms" an. |
Re: Rückgabewert der Sendmessage funktion
Moin!
Kann man nicht über die Adresse auf den Inhalt zugreifen? Außerdem funktioniert selber Code auch nicht mit Nummern (Ohne die PChars, versteht sich). Also wenn ich einfach AMsg.Result := 42; schreibe, dort wird dann null in der DLL ausgegeben. Irgendwie habe ich doch gerade einen Denkfehler, oder? Gruß, Max |
Re: Rückgabewert der Sendmessage funktion
:pale: Also, wenn die Antwort nicht mehr 42 ist, dann können wir uns begraben :?
Schau dir mal was über virtuelle Adressräume an! Kurze Einführung aus meinem leicht lückenhaften Lissen: Prinzipiell bekommt, dein Prozess, den du startest von Windows 4GB virtuellen Adressraum. Das liegt einfach daran, dass man mit den 32Bit-Registern halt 4GB referenzieren kann = 2^32. (Das wird ja jetzt auch der große Unterschied zu 64-bit-Prozessoren) Dabei ist es egal, ob du auch wirklich 4GB pro Prozess an Hardware zur Verfügung hast. Meistens brauchst du ja eh bloß ein par kB. Ausserdem nimmt dir windows von den 4GB gleich wieder 2GB weg und mapped da u.a. ein paar Windows API Funktionen rein, die du ja auch in deinem Adressraum brauchst. Für all dies ist quasi die MMU (Memory-Managment Unit) zuständig. Die rechnet deine Adresse aus deinem Pointer ein eine reale Adresse im RAM oder in der Auslagerungsdatei (wobei da noch viel anderes passiert) um. Und da kannst du machen was du willst, die MMU gibt dir nie eine reale Adresse eines anderen Prozesses zurück. Du kannst zwar Windows fragen, weil Windows, kann das schon, aber das wäre in deinem Fall wie die Sache mit den Kanonen und Spatzen. Jetzt könnt man zwar sagen, dass du deine DLL in deinem Prozess hast. Das ist durchaus möglich, aber dann könntest du ja auch mit globalen Variablen arbeiten. Ich nehme deshalb an, die DLL ist in einem anderen Prozess. Also PChar funktioniert so nicht. Eine 42 sollte allerdings hervorragend funktionieren. Und ich sehe den Fehler grad nicht. Wie ist denn die IPCMessageHandler in der WndProc registriert? Edit: Und was willst du mit der Aufrufkonvention export erreichen? |
Re: Rückgabewert der Sendmessage funktion
Zitat:
Hmm, IPCMessagehandler ist momentan so in der WndProc verankert:
Delphi-Quellcode:
Wenn ich den IPCMessageHandler jedoch direkt mit der Message verknüpft deklariere
if Msg.Msg = WM_AZURA_IPC then
begin IPCMessageHandler(msg); end; (procedure IPCMessageHandler(var msg: TMessage); message WM_AZURA_IPC;), dann funktionerts. Scheint so als würde die Übergabe per Parameter im ersten Beispiel nicht richtig funktionieren. Danke auf jeden Fall :D Gruß, Max |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz