[VB6] PostMessage [WM_Close]

Pagina: 1
Acties:
  • 307 views sinds 30-01-2008
  • Reageer

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Ben ik weer...

Ik zit nu dus al 2 uur te zoeken op een stommiteit die ik maar niet opgelost krijg.
Ik maak gebruik van VB6 (geen offtopic gedoe daarover a.u.b.) en ben nu bezig met wat API calls om processen af te sluiten.

Ik weet dat ik met TerminateProcess een proces keihard kan sluiten, maar ik wil het wel graag netjes houden. Daarvoor gebruik ik het volgende:
Visual Basic:
1
Call PostMessage(m_hWnd, WM_CLOSE, 0&, ByVal 0&) 'This call will send the message to close app


waarbij m_hWnd de handle naar mijn Window is, WM_Close = 4. Dit werkt meestal wel, maar in geval van (bijvoorbeeld!) Internet Explorer niet. Deze opent namelijk een hele bult hWnd's (iedere tooltip/toolbar etc is een hWnd).

Nu wil ik mijn functie wel redelijk generiek houden, en dus niet keihard op de IEFrame class gaan zitten zoeken ofzo. Ik kan door alle hWnd's van proces heen lopen dus ook dat is het probleem niet.

Ik gebruik de volgende code om het hWnd via een ProcessID te verkrijgen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Function GethWndFromProcessID(hProcessIDToFind As Long) As Long
    Dim hWndDesktop As Long
    Dim hWndChild As Long
    Dim hWndChildProcessID As Long
    
    On Local Error GoTo GethWndFromProcessID_Error
    
    hWndDesktop = GetDesktopWindow()    'get the handle to the desktop
    hWndChild = GetWindow(hWndDesktop, GW_CHILD)    'get the first child under the desktop
    
    Do While hWndChild <> 0 'hwndchild will = 0 when no more child windows are found
        Call GetWindowThreadProcessId(hWndChild, hWndChildProcessID)    'get the ThreadProcessID of the window
        If hWndChildProcessID = hProcessIDToFind Then   'if it matches the target, exit returning that value
            GethWndFromProcessID = hWndChild
            Exit Do
        End If
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)   'not found, so get the next hwnd
    Loop
    
    Exit Function
    
GethWndFromProcessID_Error:
    GethWndFromProcessID = 0
    Exit Function
End Function


Zoals je ziet op regel 15 spring ik uit de loop als ik een willekeurig hWND heb gevonden van het juiste proces. Deze exit kan ik eruit slopen en dan heb ik dus alle hWND's van dat proces. Maar hoe kom ik er nu achter wat het "hoofd-hWnd" van (b.v.!) Internet Explorer is?

Ik heb me rot ge-googled en in MSDN gezocht en ben tot een paar mogelijke oplossingen gekomen, maar deze werken allemaal niet.

Ik heb al met GetWindow(eenhWnd, GW_OWNER) zitten stoeien, maar die geeft voor alle hWnd's van dat process 0 terug, terwijl ik volgens MSDN de owner van die hWnd zou moeten krijgen. Eventueel moet ik dan weer een lusje in duiken om daar weer de owner van te krijgen(?) enzovoorts, of heb ik dat al het "hoofd"-hWnd?

Ik kan geen gebruik maken van callbacks, om verschillende redenen waar ik hier niet op wil in gaan, mocht dat het eerste zijn wat je te binnen schoot ;)

Ook GetParent geeft steeds 0 terug.

De oplossing die ik zoek zou het mooist zijn als ik voor regel 15 nog effe snel het "hoofd"-hWnd kon vinden.

Wat doe ik fout? Wie kan me helpen? Ik heb meer info, maar wil de post niet té lang maken ;) Als je meer wil weten hoor ik het wel.

[ Voor 9% gewijzigd door RobIII op 09-05-2003 17:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Laat maar Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/smstr2.gif
Heb het al....


Niet dus... :( :( Regels 14 t/m 16 heb ik ingevoegd, en het werkte (ik denk toevallig) 1 keer (en dus begon ik te juichen)....

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Function GethWndFromProcessID(hProcessIDToFind As Long) As Long
    Dim hWndDesktop As Long
    Dim hWndChild As Long
    Dim hWndChildProcessID As Long
    
    On Local Error GoTo GethWndFromProcessID_Error
    
    hWndDesktop = GetDesktopWindow()    'get the handle to the desktop
    hWndChild = GetWindow(hWndDesktop, GW_CHILD)    'get the first child under the desktop
    
    Do While hWndChild <> 0 'hwndchild will = 0 when no more child windows are found
        Call GetWindowThreadProcessId(hWndChild, hWndChildProcessID)    'get the ThreadProcessID of the window
        If hWndChildProcessID = hProcessIDToFind Then   'if it matches the target, exit returning that value
            Do Until GetParent(hWndChild) = 0
                hWndChild = GetParent(hWndChild)
            Loop
            GethWndFromProcessID = hWndChild
            Exit Do
        End If
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)   'not found, so get the next hwnd
    Loop
    
    Exit Function
    
GethWndFromProcessID_Error:
    GethWndFromProcessID = 0
    Exit Function
End Function


/edit/
Ondertussen heb ik ook GetAncestor met alle combinaties geprobeerd (GA_PARENT, GA_ROOT, GA_ROOTOWNER) en het grappige is dat het SOMS werkt (dan krijg ik dus bij toeval het juiste hWND-tje terug van Windows). Maar ook op alle andere manieren waarop ik het heb geprobeerd werkt het SOMS.

/weer een edit ;) /
Ook GetTopWindow geeft steeds 0. Ik doe ergens iets verkeerd denk ik? Ik zie het echt niet.

[ Voor 50% gewijzigd door RobIII op 09-05-2003 18:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Niemand die weet waar ik de mist in ga?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Nee maar je hebt schijnbaar 'n applicatie te pakken met meerdere top level windows (aangezien GetParent 0 opleverd) wat je evt nog kan doen is kijken welke windows de
WS_SYSMENU style hebben en daar een WM_SYSCOMMAND met SC_CLOSE heen sturen (is het zelfde als op het X-je drukken

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Maar waarom werken GetAncestor(bla,GA_ROOT) of GetAncestort(bla, GA_ROOTOWNER) dan niet? Of interpreteer ik de MSDN documentatie verkeerd? Ik ga je idee maandag even uitproberen...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HWND GethWndFromProcessID(DWORD ProcessID) 
{
    HWND hWndDesktop = GetDesktopWindow();
    HWND hWndChild = GetWindow(hWndDesktop, GW_CHILD);
    while (hWndChild)
    {
        DWORD  hChildProcessID;
        GetWindowThreadProcessId(hWndChild, &hChildProcessID);
        if (hChildProcessID == ProcessID) 
        {
            if ((GetWindowLong(hWndChild,GWL_STYLE) & WS_OVERLAPPEDWINDOW) == WS_OVERLAPPEDWINDOW)
                   return hWndChild;
        }
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT);
    }
    return NULL;
}

int main(int argc, char* argv[])
{
    SendMessage(GethWndFromProcessID(128),WM_SYSCOMMAND,SC_CLOSE,NULL);
    return 0;
}

Deze lijkt goed te werken....

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Verwijderd schreef op 12 May 2003 @ 09:08:
C++:
1
<knip>

Deze lijkt goed te werken....
Ook deze werkt niet :?
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Function GethWndFromProcessID(hProcessIDToFind As Long) As Long
    Dim hWndDesktop As Long
    Dim hWndTmp As Long
    Dim hWndTmpProcessID As Long
    Dim hCurr As Long
    
    On Local Error GoTo GethWndFromProcessID_Error
    
    hWndDesktop = GetDesktopWindow()    'get the handle to the desktop
    hWndTmp = GetWindow(hWndDesktop, GW_CHILD)    'get the first child under the desktop
    
    Do While (hWndTmp <> 0) 'hWndTmp will = 0 when no more child windows are found
        Call GetWindowThreadProcessId(hWndTmp, hWndTmpProcessID)    'get the ThreadProcessID of the window
        If (hWndTmpProcessID = hProcessIDToFind) Then 'if it matches the target, exit returning that value
            If ((GetWindowLong(hWndTmp, GWL_STYLE) And WS_OVERLAPPEDWINDOW) = WS_OVERLAPPEDWINDOW) Then
                GethWndFromProcessID = hWndTmp
                Exit Do
            End If
        End If
        hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)   'not found, so get the next hwnd
    Loop
    
    Exit Function
    
GethWndFromProcessID_Error:
    GethWndFromProcessID = 0
    Exit Function
End Function

Plus dat ik vrees dat dit niet generiek genoeg is...

...en ook dit werkt niet:
Verwijderd schreef op 11 May 2003 @ 03:22:
Nee maar je hebt schijnbaar 'n applicatie te pakken met meerdere top level windows (aangezien GetParent 0 opleverd) wat je evt nog kan doen is kijken welke windows de
WS_SYSMENU style hebben en daar een WM_SYSCOMMAND met SC_CLOSE heen sturen (is het zelfde als op het X-je drukken
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Function GethWndFromProcessID(hProcessIDToFind As Long) As Long
    Dim hWndDesktop As Long
    Dim hWndTmp As Long
    Dim hWndTmpProcessID As Long
    Dim hCurr As Long
    
    On Local Error GoTo GethWndFromProcessID_Error
    
    hWndDesktop = GetDesktopWindow()    'get the handle to the desktop
    hWndTmp = GetWindow(hWndDesktop, GW_CHILD)    'get the first child under the desktop
    
    Do While (hWndTmp <> 0) 'hWndTmp will = 0 when no more child windows are found
        Call GetWindowThreadProcessId(hWndTmp, hWndTmpProcessID)    'get the ThreadProcessID of the window
        If (hWndTmpProcessID = hProcessIDToFind) Then 'if it matches the target, exit returning that value
            If ((GetWindowLong(hWndTmp, GWL_STYLE) And WS_SYSMENU) = WS_SYSMENU) Then
                GethWndFromProcessID = hWndTmp
                Exit Do
            End If
        End If
        hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)   'not found, so get the next hwnd
    Loop
    
    Exit Function
    
GethWndFromProcessID_Error:
    GethWndFromProcessID = 0
    Exit Function
End Function

...<huil> Wat doe ik wrong?

[ Voor 67% gewijzigd door RobIII op 12-05-2003 10:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom zou je specifiek de windows gaan closen als je ook gewoon de threads af kunt sluiten? Als een applicatie een WM_QUIT binnen krijgt, dan sluit ie af. En aangezien WM_QUIT een thread message is en geen window message, heb je dus ook geen window nodig. Je moet alleen de message naar de juiste thread sturen, maar het kan geen kwaat om ze naar alle threads in het proces te sturen. Het vinden van alle threads bij een proces kan met Thread32First () en Thread32Next ()

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

RobIII schreef op 12 mei 2003 @ 10:00:
[...]
...<huil> Wat doe ik wrong?
Stuur je wel die WM_SYSCOMMAND /SC_CLOSE ipv die WM_CLOSE?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En voor de 684e keer verwijs ik naar mijn eigen stukje code in dit topic.

Professionele website nodig?


Verwijderd

Mijne is netter curry.. maar 1 message ipv random threads closen..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vind de mijne nog mooier, want het sluiten doe je niet door windows te closen, maar door WM_QUIT te sturen (imho dan he ;))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 12 mei 2003 @ 15:17:
Ik vind de mijne nog mooier, want het sluiten doe je niet door windows te closen, maar door WM_QUIT te sturen (imho dan he ;))
Helaas, WM_QUIT is een 'final' message. De charmes van WM_CLOSE roepen tegen de toplevel windows is dat een Notepad de gelegenheid heeft om tegen de gebruiker te roepen 'Do you want to save changes?' en meer van dat soort leuke en vooral gewenste functionaliteit. WM_QUIT is equivalent aan een cleane 'nuke', een TerminateThread met destructors. Niet voor een graceful shutdown zoals TS wil.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Yarvieh:
Mijne is netter curry.. maar 1 message ipv random threads closen..
Eveneens helaas, je hebt geen garantie dat er een window in het programma de WM_SYSMENU style heeft.

Toegegeven: in mijn stukje code zou je ook moeten checken of er toplevel-windows gevonden zijn zodat je WM_QUIT kunt sturen indien niet.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ps. voor oisyn, uit de WM_QUIT docs:
Do not post the WM_QUIT message using the PostMessage function; use PostQuitMessage.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Daar heb je gelijk in, maar wil je dat als je een proces afsluit? Zeker bij een IE window zal dat niet zo boeien. Bovendien sluit WM_QUIT ook apps af die WM_CLOSE hebben geimplementeerd als zichzelf in de tray zetten

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik zou persoonlijk nogal woest worden als een programma iets voor me spawnt dat vervolgens terwijl ik erin aan het werk ben blind genuked wordt. TS vraagt expliciet om het 'netjes' te houden, en dat houdt imho in dat je net als TaskMgr de applicatie vriendelijk verzoekt op te rotten, om na een timeout de optie te geven tot harde nuke.

Professionele website nodig?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
curry684 schreef op 12 May 2003 @ 13:30:
En voor de 684e keer verwijs ik naar mijn eigen stukje code in dit topic.
Maar da's pas de 1e keer voor mij :+
En ik vind persoonlijk "random allerlei hWnd's die bij dat proces horen" sluiten niet erg netjes.

Allemaal heel erg bedankt, maar ik ben er nog niet uit. Zoals ik al zei kan/wil ik geen callbacks gebruiken en zou ik het liefst gewoon a.d.h.v het PID de juiste hWND opzoeken. Hoe ik dan verder dat proces sluit zie ik dan wel weer... In ieder geval wordt het een WM_CLOSE ;)

Maar kan ik dus uberhaupt a.d.h.v. een willekeurig hWND uit een proces, want zover ben ik al, "terug lopen" via de parents tot het juiste hWND of zie ik dat verkeerd?

[ Voor 34% gewijzigd door RobIII op 12-05-2003 16:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

• Er worden geen random HWND's gesloten, alleen de toplevel windows van de betreffende applicatie.
• EnumWindows gedrag dat ik gebruik in dat stukje kun je faken door te loopen over alle toplevel windows.
• Volg die link eens die ik bij die code gaf naar dat Microsoft Knowledge Base artikel. Microsoft zegt zelf dat dit de enige correcte en waterdichte manier is.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

RobIII schreef op 12 mei 2003 @ 16:32:
Maar da's pas de 1e keer voor mij :+
Dat was het punt ook niet achter mijn opmerking, meer dat de zoektermen 'TerminateProcess' en 'WM_CLOSE' je via de beroemde GoT-search pagina linea recta of via-via naar die code had geleid :Y)

Professionele website nodig?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Waarom werkt dit dan niet?
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Public Function CloseProcess() As Boolean
    Dim hWndDesktop As Long
    Dim hWndTmp As Long
    Dim hWndTmpProcessID As Long
    
    On Local Error GoTo CloseProcess_Error
    
    hWndDesktop = GetDesktopWindow()    'get the handle to the desktop
    hWndTmp = GetWindow(hWndDesktop, GW_CHILD)    'get the first child under the desktop
    
    Do While (hWndTmp <> 0) 'hWndTmp will = 0 when no more child windows are found
        Call GetWindowThreadProcessId(hWndTmp, hWndTmpProcessID)    'get the ThreadProcessID of the window
        If (hWndTmpProcessID = m_ProcInfo.th32ProcessID) Then 'if it matches the target
            Call PostMessage(hWndTmp, WM_CLOSE, 0&, ByVal 0&) 'This call will send the message to close app
        End If
        Debug.Print hWndTmp, hWndTmpProcessID
        hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)   'not found, so get the next hwnd
    Loop
    CloseProcess = True
    Exit Function
    
CloseProcess_Error:
    CloseProcess = False
    Exit Function
End Function


Zoals je ziet stuur ik nu een WM_Close naar alle hWND's... :?

[ Voor 11% gewijzigd door RobIII op 12-05-2003 17:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 12 May 2003 @ 16:32:
Ik zou persoonlijk nogal woest worden als een programma iets voor me spawnt dat vervolgens terwijl ik erin aan het werk ben blind genuked wordt. TS vraagt expliciet om het 'netjes' te houden, en dat houdt imho in dat je net als TaskMgr de applicatie vriendelijk verzoekt op te rotten, om na een timeout de optie te geven tot harde nuke.
jahaa, maar als ik een app zou maken die jij ook mogelijk gaat runnen dan zou ik iets doen in de trand van:
C++:
1
2
if (GetUserName () == "curry684")
    ExitWindows ();


:P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 12 May 2003 @ 17:49:
jahaa, maar als ik een app zou maken die jij ook mogelijk gaat runnen dan zou ik iets doen in de trand van:
Jahaa maar jij bent ook een lul ;)

En ik zou bij jou meer voor de volgende aanpak kiezen:
C++:
1
SetWindowsHookEx(WH_CALLWNDPROC, main, GetModuleHandle(NULL), 0);

Want bij jouw aanpak mag ik nog gewoon op cancel klikken en al m'n data saven, en bij die van mij knalt ieder programma dat je op dit moment open hebt (tot aan explorer.exe en taskmgr.exe aan toe) gewoon simultaan aan puin O-)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

RobIII schreef op 12 May 2003 @ 17:36:
Waarom werkt dit dan niet?
Visual Basic:
1
2
3
Call PostMessage(hWndTmp, WM_CLOSE, 0&, ByVal 0&)
Debug.Print hWndTmp, hWndTmpProcessID
hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)


Zoals je ziet stuur ik nu een WM_Close naar alle hWND's... :?
Je bedoelt dat je echt geen idee hebt waarom je de 'next sibling' van dat window dat je net gesloten hebt niet meer op kunt vragen? :Y)

* curry684 is in een 'hints'-bui vandaag ipv een 'ik geef lappen code weg'-bui. :z

Professionele website nodig?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
curry684 schreef op 12 May 2003 @ 20:12:
[...]

Je bedoelt dat je echt geen idee hebt waarom je de 'next sibling' van dat window dat je net gesloten hebt niet meer op kunt vragen? :Y)

* curry684 is in een 'hints'-bui vandaag ipv een 'ik geef lappen code weg'-bui. :z
* RobIII wrijft in zijn ogen....

!#@$%^#%^$ dat ik dat niet gezien heb .... on-ge-lofe-lijk.... Fuck-A-Duck™ |:( |:(

ik ga het morgen proberen, maar dat zal wel goed komen.... duh....

edit:

Oppelost ;) Thanx... _/-\o_

[ Voor 11% gewijzigd door RobIII op 13-05-2003 10:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1