AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Rückgabewert der Sendmessage funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert der Sendmessage funktion

Ein Thema von Prototypjack · begonnen am 5. Jan 2007 · letzter Beitrag vom 5. Jan 2007
Antwort Antwort
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

Rückgabewert der Sendmessage funktion

  Alt 5. Jan 2007, 18:32
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:
const
  // Define the Message itself
  WM_AZURA_IPC = WM_USER + 4242;

  // Define the possible Values
  IPC_AZURA_QUIT = 0;
  IPC_AZURA_GETVERSION = 1;
Mainprog. Code:
Delphi-Quellcode:
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;
Dll-Code
Delphi-Quellcode:
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;
Ich hoffe ihr könnt mir helfen
Gruß,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Rückgabewert der Sendmessage funktion

  Alt 5. Jan 2007, 19:49
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.
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Rückgabewert der Sendmessage funktion

  Alt 5. Jan 2007, 20:04
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
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Rückgabewert der Sendmessage funktion

  Alt 5. Jan 2007, 20:27
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?
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Rückgabewert der Sendmessage funktion

  Alt 5. Jan 2007, 20:48
Zitat von sirius:
Also, wenn die Antwort nicht mehr 42 ist, dann können wir uns begraben
Schön, das du den Witz verstanden hast

Hmm, IPCMessagehandler ist momentan so in der WndProc verankert:
Delphi-Quellcode:
  if Msg.Msg = WM_AZURA_IPC then
  begin
    IPCMessageHandler(msg);
  end;
Wenn ich den IPCMessageHandler jedoch direkt mit der Message verknüpft deklariere
(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

Gruß,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz