Italia
Stammtisch & Caffè

Frage: Nur der Callback gemerkt - stimmt das wirklich?

 
Hallo Leute...

Es geht um [...] .
Hier steht folgendes:



The fix added a check to see if the address specified in the WM_TIMER message was registered as a call-back before taking the branch.


Keine Ahnung, ob ich in dem Artikel etwas falsch verstanden oder überlesen habe, aber per mich è das folgendes:
Der Callback wird durch SetTimer registriert. Beim Aufruf von SetTimer merkt sich der Aufrufende Prozess die Adresse der Callbackfunktion. Trifft eine Timmermessage ein, wird nun einfach nahgesehen, ob der Prozess der den Callback ausführen soll sich vorher die Adresse gemerkt hat - ist dies nicht der Fall, kommt die Timernachricht von einem anderen Prozess.
Warum funktioniert dann aber das nicht?
KompilierenMarkierenSeparieren
Def @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


KompilierenMarkierenSeparieren
Def @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
Declare Button&,TIMER_ID&,Button2&,Fenster&,Fenster$,PR_ADDR&,PR_ADDR$,Rück&,FH&
Declare AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$,Zähler&
Clear TIMER_ID&
Windowstyle 31+512
WindowTitle Timer senden
Window 0,0-640,440
Usermessages $10
Let Button&=@CreateButton(%HWND,Timer setzen,20,200,200,30)
Let Button2&=@CreateButton(%HWND,Timer posten,20,250,200,30)
LET FH&=@FindWindow(Timer empfangen)
Let Fenster$=@Input$(Fensterhandle eingeben:,Handle eines Fensters?,@STR$(FH&))
LEt Fenster&=@VAL(Fenster$)

IF Fenster$<>

    LET PR_ADDR$=@Input$(Prozeduradresse eingeben:,Adresse der TimerProc?,@STR$(@ProcAddr(TimerProc,4)))

    IF PR_ADDR$<>

        LET PR_ADDR&=@VAL(PR_ADDR$)

        While %UMESSAGE<>$10

            Waitinput
            LET TIMER_ID&=999

            IF @ButtonClicked(Button&)

                CLS
                Locate 0,0
                @SetLastError(0)
                LET RÜCK&=@SetTimer(%HWND,TIMER_ID&,60000,PR_ADDR&)
                Let AHRückgabe&=@GetLastError()
                Fehlercode_bestimmen
                Print AHGETERROR_Buffer$
                @SetLastError(0)
                LET RÜCK&=@SetTimer(Fenster&,TIMER_ID&,1000,PR_ADDR&)
                Let AHRückgabe&=@GetLastError()
                Fehlercode_bestimmen
                Print AHGETERROR_Buffer$

            Elseif @ButtonClicked(Button&)

                @PostMessage(Fenster&,$113,TIMER_ID&,PR_ADDR&)

            endif

        wend

        IF TIMER_ID&<>0

            @KillTimer(Fenster&,TIMER_ID&)
            @KillTimer(%HWND,TIMER_ID&)

        endif

    Endif

endif

End

Proc TimerProc

    Parameters FensterHandle&,T_Message&,T_ID&,SYS_TIME&
    LET T_ID&=TIMER_ID&
    Color 12,15
    Locate 3,0
    LET Zähler&=Zähler&+1
    Print Timer angekommen: +@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 in Landesspezifische Message um.
    Let AHGETERROR_Buffer$=@TRIM$(@STRING$(AHGETERROR_Buffer#,0))
    Dispose AHGETERROR_Buffer#

Endproc


Verschweigt da Microsoft was? (gilt per WindowsXP SP2, Windows2000 SP4)
 
09.09.2006  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

779 Views

Untitledvor 0 min.
Axel Berse07.11.2023
H.Brill26.01.2023
Ernst02.03.2015
gerd12.01.2013

Themeninformationen

Dieses Thema hat 1 subscriber:

unbekannt (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie