Source/ Codesnippets | | | | R.Schneider | allô
deux Programme tauschen données per WM_COPYDATA aus. simple un Programme erstellen et ensuite, um cela zweite Programme trop erstellen, qui trois markierten Zeilen im Voir le texte source par qui auskommentierten Zeilen ersetzen. qui Text im Éditer erscheint pour drücken des Sende-Buttons im Éditer des anderen Programms. Ab Profan 8 à cause de ProcAddr()
peut-être peux es oui quelqu'un brauchen.
Def CopyMemory(3) !KERNEL32,RtlMoveMemory
$H Structs.ph
$H Messages.ph
$H Windows.ph
Déclarer Ende%, SendeBtn&, EndeBtn&, Edit&
Déclarer Groesse&, Text$, ProgHndl&, AltProc&
Déclarer CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Faible CopyData#, SCopyData
Fenêtre Style 538
Titre de la fenêtre Programme1//> Pour Programme 2 cet Zeilen entfernen
Fenêtre Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
Titre de la fenêtre Programme2//< et cet Zeilen insérer
Fenêtre Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Set(FastMode,1)
EndeBtn& = Créer(Button,%hWnd,finissons,105,50,70,20)
SendeBtn& = Créer(Button,%hWnd,Senden,15,50,70,20)
Edit& = Créer(Éditer, %hWnd, , 10, 15, 170, 24)
Proc Senden
Paramètres nouvelle$
With CopyData#
.dwData& = 0
.cbData& = SizeOf(nouvelle$)
.lpData& = Addr(nouvelle$)
EndWith
SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))
ENDPROC
Proc WndProc
parameters wnd&, msg&, wparam&, lparam&
Si msg&=~WM_COPYDATA
CopyMemory(CopyData#,lparam&,12)
Groesse& = CopyData#.cbData&
Faible EigeneDaten#, Groesse&
CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
Text$ = String$(EigeneDaten#,0)
Dispose EigeneDaten#
EndIf
return call(AltProc&,wnd&,msg&,wparam&,lparam&)
ENDPROC
AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr(WndProc,4))
Tandis que 1
ProgHndl&=FindWindow(Programme2)//> Pour Programme 2 cet la ligne entfernen
ProgHndl&=FindWindow(Programme1)//< et cet la ligne insérer
Cas ProgHndl&: Pause
Sleep 100
Endwhile
Usermessages ~WM_COPYDATA
WhileNot Ende%
WaitInput
Si %Key = 2
Laisser Ende% = 1
ElseIf GetFocus(EndeBtn&)
Laisser Ende% = 1
ElseIf GetFocus(SendeBtn&)
Senden GetText $(Edit&)
ElseIf %umessage=~WM_COPYDATA
SetText Edit&, Text$
Endif
Endwhile
Dispose CopyData#
Fin
Rudger |
| | | | |
| | p.specht
| justement erfolgreich ausprobiert avec den nachfolgenden beiden Programmen (INCLUDE-Pfad anpassen!). mais: Beim Senden qui nouvelle "test" etc. klappt alles. Beim senden de "testikel" à PROGRAMM2 venez mais "testikelG" à. quoi fais je faux?
PROGRAMM1:
'INTER-PROGRAMM KOMMUNIKATION
'by Rudger Schneider, 06.04.2007
'deux Programme tauschen données per WM_COPYDATA aus. simple un Programme erstellen et ensuite,
'um cela zweite Programme trop erstellen, qui trois markierten Zeilen im Voir le texte source par qui
'auskommentierten Zeilen ersetzen. qui Text im Éditer erscheint pour drücken des Sende-Buttons
'im Éditer des anderen Programms. Ab Profan 8 à cause de ProcAddr()
'"Vielleicht peux es oui quelqu'un brauchen".
'((Vkejjb))-Grant by Rudger Schneider, 06.04.2007 sur 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
Déclarer Ende%, SendeBtn&, EndeBtn&, Edit&
Déclarer Groesse&, Text$, ProgHndl&, AltProc&
Déclarer CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Faible CopyData#, SCopyData
Fenêtre Style 538
Titre de la fenêtre "PROGRAMM1"//> Pour Programme 2 cet Zeilen entfernen
Fenêtre Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
'Titre de la fenêtre "PROGRAMM2" //< et cet Zeilen insérer
'Fenêtre Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Set("Fastmode",1)
EndeBtn& = Créer("Button",%hWnd,"Beenden",105,50,70,20)
SendeBtn& = Créer("Button",%hWnd,"Senden",15,50,70,20)
Edit& = Créer("Edit", %hWnd,», 10, 15, 170, 24)
Proc Senden
Paramètres nouvelle$
With CopyData#
.dwData& = 0
.cbData& = SizeOf(nouvelle$)
.lpData& = Addr(nouvelle$)
EndWith
SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))
ENDPROC
Proc WndProc
parameters wnd&, msg&, wparam&, lparam&
Si msg&=~WM_COPYDATA
CopyMemory(CopyData#,lparam&,12)
Groesse& = CopyData#.cbData&
Faible EigeneDaten#, Groesse&
CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
Text$ = String$(EigeneDaten#,0)
Dispose EigeneDaten#
EndIf
return call(AltProc&,wnd&,msg&,wparam&,lparam&)
ENDPROC
AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr("WndProc",4))
Tandis que 1
ProgHndl&=FindWindow("PROGRAMM2")//> Pour Programme 2 cet la ligne entfernen
//ProgHndl&=FindWindow("PROGRAMM1")//< et cet la ligne insérer
Cas ProgHndl&: Pause
Sleep 100
Endwhile
Usermessages ~WM_COPYDATA
WhileNot Ende%
WaitInput
Si %Key = 2
Laisser Ende% = 1
ElseIf GetFocus(EndeBtn&)
Laisser Ende% = 1
ElseIf GetFocus(SendeBtn&)
Senden GetText $(Edit&)
ElseIf %umessage=~WM_COPYDATA
SetText Edit&, Text$
Endif
Endwhile
Dispose CopyData#
Fin
PROGRAMM2:
'INTER-PROGRAMM KOMMUNIKATION
'by Rudger Schneider, 06.04.2007
'deux Programme tauschen données per WM_COPYDATA aus. simple un Programme erstellen et ensuite,
'um cela zweite Programme trop erstellen, qui trois markierten Zeilen im Voir le texte source par qui
'auskommentierten Zeilen ersetzen. qui Text im Éditer erscheint pour drücken des Sende-Buttons
'im Éditer des anderen Programms. Ab Profan 8 à cause de ProcAddr()
'"Vielleicht peux es oui quelqu'un brauchen".
'((Vkejjb))-Grant by Rudger Schneider, 06.04.2007 sur 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
Déclarer Ende%, SendeBtn&, EndeBtn&, Edit&
Déclarer Groesse&, Text$, ProgHndl&, AltProc&
Déclarer CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Faible CopyData#, SCopyData
Fenêtre Style 538
'Titre de la fenêtre "PROGRAMM1" //> Pour Programme 2 cet Zeilen entfernen
'Fenêtre Int(%MaxX / 2 - 200),Int(%MaxY / 2 - 100)-195,100//>
Titre de la fenêtre "PROGRAMM2"//< et cet Zeilen insérer
Fenêtre Int(%MaxX / 2 + 5),Int(%MaxY / 2 - 100)-195,100
Set("Fastmode",1)
EndeBtn& = Créer("Button",%hWnd,"Beenden",105,50,70,20)
SendeBtn& = Créer("Button",%hWnd,"Senden",15,50,70,20)
Edit& = Créer("Edit", %hWnd,», 10, 15, 170, 24)
Proc Senden
Paramètres nouvelle$
With CopyData#
.dwData& = 0
.cbData& = SizeOf(nouvelle$)
.lpData& = Addr(nouvelle$)
EndWith
SendMessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))
ENDPROC
Proc WndProc
parameters wnd&, msg&, wparam&, lparam&
Si msg&=~WM_COPYDATA
CopyMemory(CopyData#,lparam&,12)
Groesse& = CopyData#.cbData&
Faible EigeneDaten#, Groesse&
CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
Text$ = String$(EigeneDaten#,0)
Dispose EigeneDaten#
EndIf
return call(AltProc&,wnd&,msg&,wparam&,lparam&)
ENDPROC
AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr("WndProc",4))
Tandis que 1
'ProgHndl&=FindWindow("PROGRAMM2")//> Pour Programme 2 cet la ligne entfernen
ProgHndl&=FindWindow("PROGRAMM1")//< et cet la ligne insérer
Cas ProgHndl&: Pause
Sleep 100
Endwhile
Usermessages ~WM_COPYDATA
WhileNot Ende%
WaitInput
Si %Key = 2
Laisser Ende% = 1
ElseIf GetFocus(EndeBtn&)
Laisser Ende% = 1
ElseIf GetFocus(SendeBtn&)
Senden GetText $(Edit&)
ElseIf %umessage=~WM_COPYDATA
SetText Edit&, Text$
Endif
Endwhile
Dispose CopyData#
Fin
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 27.11.2018 ▲ |
| |
| | | SetWindowLong GWL_WNDPROC sur une Proc (statt mind. nProc) ist définitif un Problem - "verstärkend" jusqu'à hin trop "fahrlässig".
ici zwar (seulement) im Zusammenhang avec Utilisateur Messages versucht trop behandeln: [...]
Autor: David Strutz (---.dip0.t-ipconnect.de) date: 27.04.16 19:20 Utilisateur Messages dürften malheureusement pour wm_copydata garnicht verwendet volonté weil qui Adresse derrière dem grenier pas plus sûrement ist, weil Utilisateur Messages jadis empfangen wurden bevor vous (asynchron) aus WaitInput heraus leiten et qui Sender den allozierten grenier (lparam) pas unmöglich mittlerweile anderweitig verwendet. après bleibt ensuite datensicherer réception dans einer subclassproc, qui wiederum peux cependant Aussetzer avons et es könnten par-dessus wm_copydata Nouvelles übersehen volonté. après bleibt ensuite alors seulement une eigene wProc, cet wiederum devrait ensuite mais aussi une nProc son là qui App sonst jederzeit abstürzen pourrait weil ProcAddr sur une XProfan-Proc malheureusement seulement pour Enumeration statt aussi pour APCs verwendet volonté darf. IMHO allez sicheres wm_copydata-Empfangen avec XProfan ensuite dans liaison avec einer nProc comme wndProc. @Roland: je suis pas sûrement si je toi bereits gefragt hatte, si Du chez qui wm_copydata-nouvelle dans Deiner "default" wProc (sei es qui pour hWnd) pas une Ausnahme régulariser könntest sodass qui grenier derrière lParam aussi wirklich zur Disposition steht et sûrement trop empfangen ist aussi sans nProcs-Workaround. Es wäre aussi entier simple trop realisieren rein seulement avec 1 weiterem grenier zur Laufzeit là seulement 1 Fil: venez wm_copydata, ensuite wird qui grenier (re-)dimensioniert et qui le contenu aus lparam kopiert, et zuletzt, lparam sur qui Adresse des eigenen Mémoire mettons. wm_copydata ist une qui wertvollsten Messages. XProfan & FreeProfan rox: [...] nouvelle bearbeitet (27.04.16 19:27)
après la fois essayer une nProc "wnd_proc" trop verwenden.
//Hauptfenster Subclassing
declare owp&
cls
owp&=setWindowLong(hWnd,gwl_wndProc,procaddr(hWnd.wndProc,4))
waitinput
end
nProc hWnd.wndProc
Paramètres wnd&,msg&,wp&,lp&
global owp&
return callWindowProc(owp&,wnd&,msg&,wp&,lp&)
endproc
avec cela wären mögliche Speicherlecks zumindest eingebannt. |
| | | | |
|
Zum QuelltextOptions du sujet | 7.106 Views |
Themeninformationencet Thema hat 3 participant: |