Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249698 (11134)
  Suchen
 Zurück zur Übersicht
 AutorThema: Message
Edmund Coenen
Datum:19.05.01 22:47 Antwortenals Email verschicken (edmund.coenen@t-online.de) 


Hallo alle zusammen,
ich habe zwar schon einiges mit Profan gemacht, aber jetz bleib ich bei einem warscheinlich einfachen Problem hängen. Ich versende mit SendMessage einen Bereich an ein anderes Profan Programm. Das andere Programm reagiert auch auf das eintreffen dieser Nachricht. Allerdings kann ich den übegegebenen Bereich nicht wieder einlesen. Für jeden Hinweis bin ich dankbar.

Edmund Coenen


Sebastian König
Datum:20.05.01 13:20 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

das Problem ist, dass Du mit SendMessage nur einen Zeiger auf den Speicherbereich übergeben kannst. Dieser Zeiger hat in dem Prozess, in dem Du die Message empfängst, jedoch keinerlei Gültigkeit, da unter Windows jeder Prozess in einem seperaten Addressraum ausgeführt wird.

Es gibt mehere Möglichkeiten, dieses Problem zu lösen. Ich würde Dir empfehlen, den Bereich in eine Datei zu schreiben und dann dem anderen Programm mit einer Message zu signalisieren, dass es die Daten aus der Datei lesen kann.

MfG

Sebastian


Edmund Coenen
Datum:23.05.01 13:16 Antwortenals Email verschicken (edmund.coenen@t-online.de) 


Danke für die schnelle Antwort.
Mir ist schon klar, dass nur der Zeiger angegeben wird in SendMessage. Ich suche auch nach einer Möglichkeit die Daten aus dem Bereich im glablen Memory abzulegen und den Zeiger auf diese Daten dann zu übergeben. Vielleicht weiss einer wie man das macht.
Danke und weiterhin viel Spass.
Edmund Coenen


Maik Strohfeldt
Datum:23.05.01 14:55 Antwortenals Email verschicken (mail@msgroup.de) 


Hi,

Du willst also Daten von einem Programm ins andere Übergeben. Dann speicher die Daten doch in einem Edit-Control, dass du nicht sichtbar anbringst. Dann sendest du dem anderem Programm das Handle und dieses kann dann das Edit-Control mit Messages auslesen.

Viele Grüße,
--
Maik Strohfeldt, MS Group Software
http://www.msgroup.de


Sebastian König
Datum: 23.05.01 18:53 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

einen solchen globalen Speicher gibt es im 32bit-Windows leider nicht. Du kannst ihn aber mit den API-Funktionen CreateFileMapping() [bzw. OpenFileMapping()] und MapViewOfFile() "emulieren".
Hier sind zwei Beispiel Quellcodes dazu: Das 2. Programm liest die Daten aus, die das erste in den gemeinsam genutzten Speicher schreibt. Voraussetzung ist Profan 7.0 (wegen UserMessages)

Programm 1:
DEF CreateFileMapping(6) !"KERNEL32","CreateFileMappingA"
DEF MapViewOfFile(5) !"KERNEL32","MapViewOfFile"
DEF CloseHandle(1) "KERNEL32","CloseHandle"

declare name$
declare hFileMap&,backup&,pMem#
declare targetWin&

dim pMem#,@mul(1024,50) '50 kb

window 0,0-300,200
windowtitle "FileMapping - Server"

'---FileMapping-Objekt erstellen:
let name$ = "-$filemap01"
let hFileMap& = CreateFileMapping($FFFFFFFF,0,4,0,@mul(1024,50),Addr(name$))

'---"Datei" in den Speicher abbilden und Ergebnis einer Bereichsvariablen zuweisen:
let backup& = pMem#
let pMem# = MapViewOfFile(hFileMap&,983071,0,0,0) '983071 = FILE_MAP_ALL_ACCESS

'---Auf anderen Prozess warten:
print "Warte auf Client..."

whilenot targetWin&
 let targetWin& = @FindWindow("FileMapping-Client")
 Sleep 100
wend

print "Client gefunden - Daten geschrieben"

'---Daten in den Speicher schreiben und dem Zielfenster signalisieren, dass
'---es die Daten auslesen kann:
long pMem#,0 = 1234

SendMessage(targetWin&,$0401,0,0) '$0401 = WM_USER + 1

waitinput

'---Aufräumen:
CloseHandle(hFileMap&)
let pMem# = backup&

end

Programm 2:
DEF OpenFileMapping(3) !"KERNEL32","OpenFileMappingA"
DEF MapViewOfFile(5) !"KERNEL32","MapViewOfFile"
DEF CloseHandle(1) "KERNEL32","CloseHandle"

declare name$
declare hFileMap&,backup&,pMem#

dim pMem#,@mul(1024,50) '50 kb

window 100,100-300,200
windowtitle "FileMapping-Client"

'---FileMapping-Objekt erstellen:
let name$ = "-$filemap01"
let hFileMap& = OpenFileMapping(983071,1,Addr(name$))

'---"Datei" in den Speicher abbilden und Ergebnis einer Bereichsvariablen zuweisen:
let backup& = pMem#
let pMem# = MapViewOfFile(hFileMap&,983071,0,0,0) '983071 = FILE_MAP_ALL_ACCESS

UserMessages $0401

while 1
 waitinput

 if %uMessage
  print "Daten gelesen:",@long(pMem#,0)
  break
 endif
wend

waitinput

'---Aufräumen:
CloseHandle(hFileMap&)
let pMem# = backup&

end

Ich hoffe, ich konnte Dir helfen.

MfG

Sebastian


 Zurück zur Übersicht