Español
Fuente/ Codesnippets

Copydata Kommunikation Prozessen Wmcopydata

 

R.Schneider
¡Hola

Zwei Programas tauschen Daten por WM_COPYDATA de. Einfach una Programa redactar y luego, en el zweite Programa a redactar, el drei markierten Zeilen en el Ver código fuente por el auskommentierten Zeilen sustituir. Der Texto en el Editar erscheint después de drücken des Sende-Buttons en el Editar des otro Programms.
Ab Profano 8 wegen ProcAddr()

Tal vez kann lo sí alguien brauchen.
Def CopyMemory(3) !KERNEL32,RtlMoveMemory
 $H Structs.ph
 $H Messages.ph
 $H Windows.ph
Declarar Ende%, SendeBtn&, EndeBtn&, Edit&
Declarar Groesse&, Texto$, ProgHndl&, AltProc&
Declarar CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Dim CopyData#, SCopyData
Ventana de Estilo 538
Título de la ventana Programa1//> Für Programa 2 esta Zeilen entfernen
Ventana Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
Título de la ventana Programa2//< y esta Zeilen einfügen
Ventana Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Conjunto(FastMode,1)
EndeBtn& = Crear(Button,%hWnd,Beenden,105,50,70,20)
SendeBtn& = Crear(Button,%hWnd,Senden,15,50,70,20)
Edit& = Crear(Editar, %hWnd, , 10, 15, 170, 24)

Proc Senden

    Parámetros Nachricht$

    With CopyData#

        .dwData& = 0
        .cbData& = SizeOf(Nachricht$)
        .lpData& = Addr(Nachricht$)

    EndWith

    SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))

ENDPROC

Proc WndProc

    parámetros wnd&, msg&, wparam&, lparam&

    If msg&=~WM_COPYDATA

        CopyMemory(CopyData#,lparam&,12)
        Groesse& = CopyData#.cbData&
        Dim EigeneDaten#, Groesse&
        CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
        Texto$ = String$(EigeneDaten#,0)
        Disponer EigeneDaten#

    EndIf

    volver call(AltProc&,wnd&,msg&,wparam&,lparam&)

ENDPROC

AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr(WndProc,4))

Mientras que 1

    ProgHndl&=FindWindow(Programa2)//> Für Programa 2 esta Línea entfernen
    ProgHndl&=FindWindow(Programa1)//< y esta Línea einfügen
    Case ProgHndl&: Romper
    Sleep 100

EndWhile

Usermessages ~WM_COPYDATA

Sinestar encargado Ende%

    WaitInput

    If %Key = 2

        Let Ende% = 1

    ElseIf GetFocus(EndeBtn&)

        Let Ende% = 1

    ElseIf GetFocus(SendeBtn&)

        Senden GetText $(Edit&)

    ElseIf %umessage=~WM_COPYDATA

        SetText Edit&, Texto$

    Endif

EndWhile

Disponer CopyData#
End

Rudger
 
Perbody is nofect !
06.04.2007  
 




p.specht

Gerade erfolgreich ausprobiert con el nachfolgenden beiden Programmen (INCLUDE-Pfad adaptar!). Aber: Beim Senden el Nachricht "test" etc. klappt alles. Beim senden de "testikel" a PROGRAMM2 kommt aber "testikelG" a. Was mache Yo falso?

PROGRAMM1:
'INTER-PROGRAMM KOMMUNIKATION
'by Rudger Schneider, 06.04.2007
'Zwei Programas tauschen Daten por WM_COPYDATA de. Einfach una Programa redactar y luego,
'en el zweite Programa a redactar, el drei markierten Zeilen en el Ver código fuente por el
'auskommentierten Zeilen sustituir. Der Texto en el Editar erscheint después de drücken des Sende-Buttons
'en el Editar des otro Programms. Ab Profano 8 wegen ProcAddr()
'"Vielleicht kann lo sí alguien brauchen".
'((Vkejjb))-Grant by Rudger Schneider, 06.04.2007 en Xprofan.net
Def CopyMemory(3) !"KERNEL32","RtlMoveMemory"
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Structs.ph
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Messages.ph
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Windows.ph
Declarar Ende%, SendeBtn&, EndeBtn&, Edit&
Declarar Groesse&, Texto$, ProgHndl&, AltProc&
Declarar CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Dim CopyData#, SCopyData
Ventana de Estilo 538
Título de la ventana "PROGRAMM1"//> Für Programa 2 esta Zeilen entfernen
Ventana Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
'Título de la ventana "PROGRAMM2" //< y esta Zeilen einfügen
'Ventana Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Conjunto("FastMode",1)
EndeBtn& = Crear("Button",%hWnd,"Beenden",105,50,70,20)
SendeBtn& = Crear("Button",%hWnd,"Senden",15,50,70,20)
Edit& = Crear("Edit", %hWnd,"", 10, 15, 170, 24)

Proc Senden

    Parámetros Nachricht$

    With CopyData#

        .dwData& = 0
        .cbData& = SizeOf(Nachricht$)
        .lpData& = Addr(Nachricht$)

    EndWith

    SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))

ENDPROC

Proc WndProc

    parámetros wnd&, msg&, wparam&, lparam&

    If msg&=~WM_COPYDATA

        CopyMemory(CopyData#,lparam&,12)
        Groesse& = CopyData#.cbData&
        Dim EigeneDaten#, Groesse&
        CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
        Texto$ = String$(EigeneDaten#,0)
        Disponer EigeneDaten#

    EndIf

    volver call(AltProc&,wnd&,msg&,wparam&,lparam&)

ENDPROC

AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr("WndProc",4))

Mientras que 1

    ProgHndl&=FindWindow("PROGRAMM2")//> Für Programa 2 esta Línea entfernen
    //ProgHndl&=FindWindow("PROGRAMM1")//< y esta Línea einfügen
    Case ProgHndl&: Romper
    Sleep 100

EndWhile

Usermessages ~WM_COPYDATA

Sinestar encargado Ende%

    WaitInput

    If %Key = 2

        Let Ende% = 1

    ElseIf GetFocus(EndeBtn&)

        Let Ende% = 1

    ElseIf GetFocus(SendeBtn&)

        Senden GetText $(Edit&)

    ElseIf %umessage=~WM_COPYDATA

        SetText Edit&, Texto$

    Endif

EndWhile

Disponer CopyData#
End

PROGRAMM2:
'INTER-PROGRAMM KOMMUNIKATION
'by Rudger Schneider, 06.04.2007
'Zwei Programas tauschen Daten por WM_COPYDATA de. Einfach una Programa redactar y luego,
'en el zweite Programa a redactar, el drei markierten Zeilen en el Ver código fuente por el
'auskommentierten Zeilen sustituir. Der Texto en el Editar erscheint después de drücken des Sende-Buttons
'en el Editar des otro Programms. Ab Profano 8 wegen ProcAddr()
'"Vielleicht kann lo sí alguien brauchen".
'((Vkejjb))-Grant by Rudger Schneider, 06.04.2007 en Xprofan.net
Def CopyMemory(3) !"KERNEL32","RtlMoveMemory"
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Structs.ph
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Messages.ph
 $H C:\Program Files (x86)\XProfan11\INCLUDE\Windows.ph
Declarar Ende%, SendeBtn&, EndeBtn&, Edit&
Declarar Groesse&, Texto$, ProgHndl&, AltProc&
Declarar CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Dim CopyData#, SCopyData
Ventana de Estilo 538
'Título de la ventana "PROGRAMM1" //> Für Programa 2 esta Zeilen entfernen
'Ventana Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
Título de la ventana "PROGRAMM2"//< y esta Zeilen einfügen
Ventana Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Conjunto("FastMode",1)
EndeBtn& = Crear("Button",%hWnd,"Beenden",105,50,70,20)
SendeBtn& = Crear("Button",%hWnd,"Senden",15,50,70,20)
Edit& = Crear("Edit", %hWnd,"", 10, 15, 170, 24)

Proc Senden

    Parámetros Nachricht$

    With CopyData#

        .dwData& = 0
        .cbData& = SizeOf(Nachricht$)
        .lpData& = Addr(Nachricht$)

    EndWith

    SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))

ENDPROC

Proc WndProc

    parámetros wnd&, msg&, wparam&, lparam&

    If msg&=~WM_COPYDATA

        CopyMemory(CopyData#,lparam&,12)
        Groesse& = CopyData#.cbData&
        Dim EigeneDaten#, Groesse&
        CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
        Texto$ = String$(EigeneDaten#,0)
        Disponer EigeneDaten#

    EndIf

    volver call(AltProc&,wnd&,msg&,wparam&,lparam&)

ENDPROC

AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr("WndProc",4))

Mientras que 1

    'ProgHndl&=FindWindow("PROGRAMM2")//> Für Programa 2 esta Línea entfernen
    ProgHndl&=FindWindow("PROGRAMM1")//< y esta Línea einfügen
    Case ProgHndl&: Romper
    Sleep 100

EndWhile

Usermessages ~WM_COPYDATA

Sinestar encargado Ende%

    WaitInput

    If %Key = 2

        Let Ende% = 1

    ElseIf GetFocus(EndeBtn&)

        Let Ende% = 1

    ElseIf GetFocus(SendeBtn&)

        Senden GetText $(Edit&)

    ElseIf %umessage=~WM_COPYDATA

        SetText Edit&, Texto$

    Endif

EndWhile

Disponer CopyData#
End
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
27.11.2018  
 



SetWindowLong GWL_WNDPROC en una Proc (en lugar de mind. nProc) es definitiv una Problema - "verstärkend" a hin a "fahrlässig".

hier zwar (sólo) en el Zusammenhang con Mensajes del usuario intenta a behandeln:  [...] 


Autor: David Strutz (---.dip0.t-ipconnect.de)
Datum: 27.04.16 19:20

Mensajes del usuario dürften desafortunadamente para wm_copydata garnicht verwendet
voluntad porque el Adresse hinter el Speicher no mehr sicher es,
porque Mensajes del usuario längst empfangen fueron bevor ellos (asynchron)
de WaitInput heraus guía y Sender el allozierten Speicher
(lparam) no unmöglich mittlerweile anderweitig verwendet.

Danach restos entonces datensicherer Empfang en uno subclassproc,
el wiederum kann sin embargo Aussetzer haben y lo könnten darüber
wm_copydata Noticias übersehen voluntad.

Danach restos entonces also sólo una propio wProc, esta wiederum
debería entonces aber auch una nProc ser como el App sonst en cualquier momento
abstürzen podría porque ProcAddr en una XProfan-Proc desafortunadamente sólo para
Enumeration en lugar de auch para APCs verwendet voluntad darf.

IMHO va sicheres wm_copydata-Empfangen con XProfan entonces en
Verbindung con uno nProc como wndProc.

@Roland: Yo bin no sicher si Yo Usted ya gefragt hatte, si
Usted en wm_copydata-Nachricht en Deiner "default" wProc
(sei lo el para hWnd) no una Excepción regeln könntest
sodass el Speicher hinter lParam auch wirklich disponible
es y sicher a empfangen es auch sin nProcs-Workaround.

Lo wäre auch bastante simplemente a realisieren rein sólo 1 weiterem
Speicher a Laufzeit como sólo 1 Hilo: Kommt wm_copydata,
Luego se el Speicher (re-)dimensioniert y Inhalt de
lparam kopiert, y zuletzt, lparam en el Adresse des
eigenen Speichers conjunto.

wm_copydata es una el wertvollsten Messages.

XProfan & FreeProfan rox:  [...] 

Nachricht bearbeitet (27.04.16 19:27)


Danach veces probieren una nProc "wnd_proc" utilizarse.
//Ventana principal Subclassing
declarar owp&
cls
owp&=setWindowLong(hWnd,gwl_wndProc,procaddr(hWnd.wndProc,4))
waitinput
end

nProc hWnd.wndProc

    Parámetros wnd&,msg&,wp&,lp&
    global owp&
    volver callWindowProc(owp&,wnd&,msg&,wp&,lp&)

ENDPROC


Damit wären mögliche Speicherlecks zumindest eingebannt.
 
05.12.2018  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

7.101 Views

Untitledvor 0 min.
H.Brill17.10.2022
Stefan8102.01.2020
Pedro Miguel26.05.2019
Michael Borowiak07.03.2019
Más...

Themeninformationen

Dieses Thema ha 3 subscriber:

iF (1x)
p.specht (1x)
R.Schneider (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie