Fuente/ Codesnippets | | | | 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 |
| | | | |
| | 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 11Computer: 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. |
| | | | |
|
Zum QuelltextThemeninformationenDieses Thema ha 3 subscriber: |