Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249698 (11134)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Message
Edmund Coenen
| Datum:19.05.01 22:47 (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 (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 (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 (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 (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