| |
|
|
| allô gens...
und dir um [...] . ici steht folgendes:
The fix added a check to lac si le address specified dans le WM_TIMER message quoi registered as a call-back before taking le branch.
je n'en sais rien, si je dans dem Artikel quelque chose faux verstanden ou bien überlesen habe, mais pour mich est cela folgendes: qui Callback wird par SetTimer registriert. Beim Aufruf de SetTimer merkt sich qui Aufrufende Prozess qui Adresse qui Callbackfunktion. Trifft une Timmermessage un, wird eh bien simple nahgesehen, si qui Prozess qui den Callback effectuer soll sich auparavant qui Adresse gemerkt hat - ist ca pas qui le cas, venez qui Timernachricht de einem anderen Prozess. pourquoi funktioniert ensuite mais cela pas? KompilierenMarqueSéparationDef @SetTimer(4) !USER32,SetTimer
Def @KillTimer(2) !USER32,KillTimer
DEF @GetDlgCtrlID(1) !USER32,GetDlgCtrlID
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
Declare Button&,TIMER_ID&,Zähler&
Clear TIMER_ID&
Windowstyle 31+512
WindowTitle Timer empfangen
Window 0,0-640,440
Usermessages $10
Let Button&=@CreateButton(%HWND,Timer setzen,20,200,200,30)
Print Handle des Hauptfensters: +@STR$(%HWND)
Print Adresse der Prozedur: +@STR$(@ProcAddr(TimerProc,4))
While %UMESSAGE<>$10
Waitinput
IF @ButtonClicked(Button&)
Enablewindow Button&,0
LET TIMER_ID&=999
@SetTimer(%HWND,TIMER_ID&,60000,@ProcAddr(TimerProc,4))
endif
wend
IF TIMER_ID&<>0
@KillTimer(%HWND,TIMER_ID&)
endif
End
Proc TimerProc
Parameters FensterHandle&,T_Message&,T_ID&,SYS_TIME&
Color 12,15
Locate 3,0
LET Zähler&=Zähler&+1
Print Timer angekommen: +@STR$(T_ID&)+ +@STR$(SYS_TIME&)+ +@STR$(Zähler&)+@Space$(20)
ENDPROC
KompilierenMarqueSéparationDef @SetTimer(4) !USER32,SetTimer
Def @KillTimer(2) !USER32,KillTimer
DEF @GetDlgCtrlID(1) !USER32,GetDlgCtrlID
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
Def @GetLastError(0) !KERNEL32,GetLastError
Def @SetLastError(1) !KERNEL32,SetLastError
DEF @AHFormatMessage(7) !KERNEL32,FormatMessageA
Déclarer Button&,TIMER_ID&,Button2&,Fenster&,la fenêtre$,PR_ADDR&,PR_ADDR$,Rück&,FH&
Déclarer AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$,Zähler&
Claire TIMER_ID&
Windowstyle 31+512
Titre de la fenêtre Minuteur senden
Fenêtre 0,0-640,440
Usermessages $10
Laisser Button&=@CreateButton(%HWND,Minuteur mettons,20,200,200,30)
Laisser Button2&=@CreateButton(%HWND,Minuteur posten,20,250,200,30)
LET FH&=@FindWindow(Minuteur empfangen)
Laisser la fenêtre$=@Contribution$(Fensterhandle eingeben:,Handle eines Fensters?,@STR$(FH&))
LEt Fenster&=@VAL(la fenêtre$)
IF la fenêtre$<>
LET PR_ADDR$=@Contribution$(Prozeduradresse eingeben:,Adresse qui TimerProc?,@STR$(@ProcAddr(TimerProc,4)))
IF PR_ADDR$<>
LET PR_ADDR&=@VAL(PR_ADDR$)
Tandis que %UMESSAGE<>$10
Waitinput
LET TIMER_ID&=999
IF @ButtonClicked(Button&)
CLS
Localiser 0,0
@SetLastError(0)
LET RÜCK&=@SetTimer(%HWND,TIMER_ID&,60000,PR_ADDR&)
Laisser AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
Imprimer AHGETERROR_Buffer$
@SetLastError(0)
LET RÜCK&=@SetTimer(Fenster&,TIMER_ID&,1000,PR_ADDR&)
Laisser AHRückgabe&=@GetLastError()
Fehlercode_bestimmen
Imprimer AHGETERROR_Buffer$
Elseif @ButtonClicked(Button&)
@Poster un message(Fenster&,$113,TIMER_ID&,PR_ADDR&)
endif
Wend
IF TIMER_ID&<>0
@KillTimer(Fenster&,TIMER_ID&)
@KillTimer(%HWND,TIMER_ID&)
endif
Endif
endif
Fin
Proc TimerProc
Paramètres FensterHandle&,T_Message&,T_ID&,SYS_TIME&
LET T_ID&=TIMER_ID&
Color 12,15
Localiser 3,0
LET Zähler&=Zähler&+1
Imprimer Minuteur arrivé: +@STR$(FensterHandle&)+ +@STR$(T_ID&)+ +@STR$(SYS_TIME&)+ +@STR$(Zähler&)+@Space$(20)
ENDPROC
Proc Fehlercode_bestimmen
DIM AHGETERROR_Buffer#,32000
@AHFormatMessage($1000,0,AHRückgabe&,0,AHGETERROR_Buffer#,32000,0) Wandelt Fehlercode dans Landesspezifische Message um.
Laisser AHGETERROR_Buffer$=@TRIM$(@STRING$(AHGETERROR_Buffer#,0))
Dispose AHGETERROR_Buffer#
ENDPROC
Verschweigt là Microsoft quoi? (gilt pour WindowsXP SP2, Windows2000 SP4) |
|
|
| |
|
|