AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [NonVCL] Problem WndProc; Pointer mit Daten füllen
Thema durchsuchen
Ansicht
Themen-Optionen

[NonVCL] Problem WndProc; Pointer mit Daten füllen

Ein Thema von NickelM · begonnen am 14. Mär 2012 · letzter Beitrag vom 16. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2      
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

[NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 15:56
Hallo zusammen,

Ich bin gerade dabei ein Plugin für TS3 in Delphi zuschreiben. Die Funktionen und so funken nach langen entlich. Nun wollte ich folgendes machen:
- Eigene Window-Message wo ich dem lparam einen PAnsiChar übergebe.
- Die SendMessageA (wegen AnsiChar, da ich einen AniString in UTF-8-Encoding verschicke) von der Plugin-DLL aufrufen und ausgeben.

So also was ich festgestellt habe ist, dass ich irgendwas falsch mache beim füllen der Daten in meiner WndProc. Gibt es irgendeine spezielle Funktion zum Speichern in einen Pointer bei der WndProc oder steh ich einfach aufm Schlauch?

Hier der Code:
Delphi-Quellcode:
//WndProc der Anwendung
function WndMainProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var Text : AnsiString;
begin
  Result := 0;
  case uMsg of
  //.....
    WM_MUSIKBOT_PLAY:
    begin
      Text:= UTF8Encode(StreamList.Names[wParam]); //Der Wert existiert
      StrPLCopy(PAnsiChar(lParam),Text,50);
      //Move(Text[1],Pointer(lParam)^,50); //dies hab ich auch versucht geht auch nicht
    end;
  end;
end;
//Aufruf aus der Plugin-DLL.
var
StreamName : array [0..50] of AnsiChar;
begin
   //SendMessageA(WindowH,WM_GETTEXT,50,Integer(@StreamName)); //Lustig hier ist, das dies geht
  SendMessageA(WindowH,WM_MUSIKBOT_PLAY,0,Integer(@StreamName)); //der wParam wird hier für etwas anderes genutz und das Resultat wird nur für Errors verwendet
  //Ausgeben
end;
Wenn ich mir vorm beenden der Funktion in der WndProc, lParam zu einem PAnsiChar caste,bekomme ich den richtigen Text. Was mach ich falsch? Verstehs net.
Wenn ich eine "fertige" Windows-Message nehme geht es. Also muss es irgendwie an der WndProc liegen.

Gruß
NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 16:09
Weißt du eigentlich, was du da machst? Die DLL schickt deinem Programm eine Nachricht mit einer Zeichenfolge im LParam. Du empfängst diese Nachricht in deiner WndProc. Dort weißt du den Inhalt des WParam der AnsiString Variable Text zu. Dann kopierst du den Text in den Parameter der WndProc. Zum einen macht das keinen Sinn. Und zum Anderen ist LParam vom Typ DWord. Es wird also mit der Zeichenkette nichts anfangen können.

Aber die Frage ist, was willst du eigentlich machen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#3

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 16:26
Dort weißt du den Inhalt des WParam der AnsiString Variable Text zu.
Da WParam = 0, weist er der Variablen "Text" "StreamList.Names[0]" zu.
Dann kopierst du den Text in den Parameter der WndProc. Zum einen macht das keinen Sinn. Und zum Anderen ist LParam vom Typ DWord. Es wird also mit der Zeichenkette nichts anfangen können.
Da LParam einen Zeiger auf die Variable StreamName beinhalted, überschreibt er so den Inhalt dieser Variable mit dem Inhalt aus "Text".

Edit:
So kann das aber nur innerhalb einer Anwendung funktionieren, da jede Anwendung ihren eigenen Adressraum hat.
Datenaustausch zwischen verschiedenen Anwendungen ist z.B. mit WM_COPYDATA möglich.

Geändert von Blup (14. Mär 2012 um 16:39 Uhr)
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#4

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 16:36
@Blup: WParam wird manchmal als Index verwendet, falls er höher ist als 0. Bei 0 leg ich den Index anders fest, aber das ist nicht das Prob, da trotzdem die Variable Text gefüllt wird. Sonst hast du völlig Recht. Nach meiner Kenntniss sollte es funken, aber dies tut es ja nicht .

EDIT: Doffe Frage, kann es sein, das ich erst irgendwie meiner WndProc (z.b. dem Programm) Rechte geben muss um auf den Speicher von der DLL-Variable zuzugreifen? Anscheinend macht die normale WndProc noch irgendwas, um in den Speicherbereich von der Variablen schreiben zukönnen. Oder irre ich da?
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (14. Mär 2012 um 16:40 Uhr)
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#5

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 18:26
Das habe ich mir auch schon gedacht. Aber warum funkt dann SendMessageA(WindowH,WM_GETTEXT,50,Integer(@StreamName) ?
WindowH wird doch, wie ich Windows kenne, auch ein Pointer auf irgendein Speicher sein. Weil das liesst ja von der anderen Anwendung den Fenster-Titel aus. Oder liegt das in einer Art Globalen Windows Speicher?
Naja, ich versuch mal ob ich das mit WM_COPYDATA irgendwie hinbekomme, was ich möchte.
Würd mich troztdem interessieren warum die oben genannte Zeile funkt. Die müsste eigentlich ja dan auch nicht funktionieren.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#6

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 19:09
Njain, Handle haben nichts mit Pointern zu tun. (auch wenn einige weniger Handle aktuell intern als Pointer verwaltet werden, wie z.B. das Handle von geladenen Modulen, wie DLLs)

Stell die Handle eher als Index in einer Liste vor.

Bei Messages wie WM_TEXT haben die Parameter eine vorgegebene Funktion, bzw. ein definiertes Datenformat, welches Windows kennt.
Demnach kann Windows dort auch den entsprechenden Speicher kopieren, wenn er in ein anderes Programm rüber muß.
Bei WM_COPYDATA wird ebenfalls angegeben wie und wo Daten liegen und Windows kann sich ebenfalls um das Kopieren kümmern.

Ansonsten (vorallem bei eigenen Messages) kann man eben nur Integer übergeben.
Oder Anderes, welches als global eindeutiger Wert darin übergeben werden kann. (z.B. globale Handle)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#7

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 22:28
Hm...also gibt es keine Möglichkeit auser WM_COPYDATA, irgendeine Variable zuerzeugen, egal ob Handle oder Pointer, die ich per SendMessage von der Plugin-DLL an die Anwendung übergeben kann um dort wieder auf meine Daten, die ich irgendwo hinterlegt habe, von 2 verschiedene Anwendungen drauf zugreifen kann?
Ich hab schon viel von Pipes gehört usw. , aber wie gesagt nur gehört. Ob das damit geht, weis ich auch nicht. Hab grad nen bischen mit GlobalAlloc und VirtualAlloc getestet, auch bei GlobalAlloc, den Handle an die andere übergeben, kein Unterschied. Ich werde wohl schauen müssen, ob ich irgendwie eine MessageLoop mit einem "unsichtbaren" Fenster in der DLL erzeuge und hoffen, dass ich dan mit WM_COPYDATA die Daten rüberbekomme.

Gruß
NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#8

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 23:44
'ne Pipe ist wie eine Datei ... also eine Art Dateihandle und da diese Prozessgebunden sind, müßtest du bei Übergabe dieses Handle klonen.
Da der Empfänger den Sender nicht kennt und der Kloner das Recht benitzten muß das gewünschte Handle überhaupt klonen zu dürfen, wäre es vermutlich einfacher das Handle gleich beim Sender zu klonen, passend für den Zielprozess.
Oder MMF (Memory Mapped Files).

Tipp: IPC wäre das Thema, worüber du dich informieren solltest.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Mär 2012 um 23:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 14. Mär 2012, 23:54
falls Du Dich mit Pipes beschäftigen möchtest gibt es von Russell nette freie Komponenten, ich habe sie allerdings mittlerweile massiv erweitert und angepasst, der einzige Links den ich auf die Schnelle finden konnte:

http://r3code.livejournal.com/117012.html
http://micksmix.wordpress.com/2011/0...it-for-delphi/
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: [NonVCL] Problem WndProc; Pointer mit Daten füllen

  Alt 15. Mär 2012, 00:00
Da LParam einen Zeiger auf die Variable StreamName beinhalted, überschreibt er so den Inhalt dieser Variable mit dem Inhalt aus "Text".
Ja, OK, das stimmt. Aber mich verwirrt, was er damit erreichen will. Ich dachte er wollte an die Zeichenkette kommen, die auf die er im LParam einen Zeiger hat. Das Problem ist, um es noch mal deutlich zu machen, dass Zeiger nicht über Prozessgrenzen gültig sind. Es gibt ausnahmen. Bei WM_TEXT mapped Windows den Speicherbereich in einen Speicherbereich der für beide Prozesse gültig ist, so dass das mit den Zeigern funktioniert. Das sind noch Überbleibsel aus 16-Bit Windows Zeiten, als es noch keine getrennten Speicherbereiche gab. Bei WM_COPYDATA verfährt Windows ähnlich. Allerdings handelt es sich dabei um eine Fensternachricht, so dass zumindest der Empfänger ein Fenster sein muss. Ob auch der Thread von dem die Nachricht verschickt wird zu einem Fenster gehören muss, weiß ich jetzt nicht, aber man könnte es mal probieren, ob es auch ohne Fenster geht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:38 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