[C++] Error Invalid Window Handle na restart van programma

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • das_phantom
  • Registratie: December 2008
  • Laatst online: 09-08-2023
Ik ben bezig met een chatbot te ontwikkelen voor een standalone chatprogramma. Nu wil ik ervoor zorgen dat als de verbinding is verbroken met de chatserver, dat de chatbot het chatprogramma afsluit, opnieuw start en weer verder gaat als er een verbinding is.

C++:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
SendMessage(ping, WM_GETTEXT, 100, (LPARAM)pingz);//1400 ERROR AFTER RESET
        

            string p = pingz; 
                
            if (p.find("Ping")==-1) //offline
            
            
            {           

            
            SendMessage(parent, WM_CLOSE, 0,0);             //kill brchat.exe
            ShellExecute(0,"open","c:/brchat.exe.lnk",0,0,SW_SHOWMAXIMIZED); //open new proccess
            
            Sleep(5000);

                    
            SetCursorPos(963,504);
            mouse_event(MOUSEEVENTF_LEFTDOWN,963,504,0,0); //click connect button
            mouse_event(MOUSEEVENTF_LEFTUP,963,504,0,0);
            
            Sleep(10000);

            
            HWND parent = FindWindow("BRWindowClass", 0);
            HWND childmdi = FindWindowEx(parent, NULL, "mdiclient", NULL);
            HWND childflow = FindWindowEx(childmdi, NULL, "Brchildclass", "flow");
            HWND childchat = FindWindowEx(childflow, NULL, "Richedit20a", NULL);
            HWND childedit = FindWindowEx(childflow, NULL, "Edit", NULL);
            HWND ping = FindWindowEx(parent,0, "msctls_statusbar32", 0);
            


                if (childchat == 0) 
            
                {   //server probably down
                
                //close errormessage
                SetCursorPos(1030,614);
                mouse_event(MOUSEEVENTF_LEFTDOWN,1030,614,0,0);
                mouse_event(MOUSEEVENTF_LEFTUP,1030,614,0,0);               
                
                //wait 10 minutes
                
                Sleep(100000);
                continue;

                }

                else //online now
                {
                
                SetWindowText(parent, (LPSTR)title);//WORKS                                     
                SendMessage(ping, WM_GETTEXT, 100, (LPARAM)pingz); //works  
                
                
        
                continue; 
            
                }
            }


Ik maak hiervoor gebruik van een statusbar aanwezig in het programma, waarop het woord Ping staat als er een verbinding is. Zoals het nu werkt wordt een disconnect gedetecteerd, het programma afgesloten en opnieuw gestart. Het probleem is echter dat de eerste regel met Sendmessage in de code, eerst wel werkt, maar na restart van het programma een error 1400 geeft = Invalid Window Handle en het programma blijft herstarten omdat er geen Ping gevonden kan worden. Dit heb ik opgelost door de onderste Sendmessage te sturen, die wel gewoon werkt met exact dezelfde Handle. Hoe kan dit? Het zijn twee exact dezelfde regels...

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 12:22

Sebazzz

3dp

Je hebt gelijk dat het twee dezelfde regels zijn, echter gebeurt er wel wat tussen. Op regel 30 wijs je ping opnieuw toe. De ping ervoor is dan niet hetzelfde als de ping die je erna krijgt.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • das_phantom
  • Registratie: December 2008
  • Laatst online: 09-08-2023
Dat klopt maar zoals ik het zie gebeurt er dit:

Na deze toewijzing gaat de compiler(?) naar uiteindelijk regel 54 en maakt hij gebruik van deze toewijzing. Vervolgens zorg ik door middel van Continue dat de compiler weer van voren begint met dit stuk omdat het onderdeel uitmaakt van een loop die hier niet te zien is. De compiler komt dan uiteindelijk weer bij regel 1 aan en maakt gebruik van zoals ik het zie dezelfde toewijzing.

while (1)
{

Deze code staat boven de geplaatste code.

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 12:22

Sebazzz

3dp

Compiler draait maar één keer, en dit is zo te zien geen managed C++ (dus geen JIT). Je bedoeld de uitvoering/processor/executor. Plaats eens een breakpoint op regel 1 of laat hem ping naar je debugvenster afdrukken. Je zal waarschijnlijk zien dat ping een keer ongeldig is.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • das_phantom
  • Registratie: December 2008
  • Laatst online: 09-08-2023
Toegevoegd op regel 2:

cout << "ping =" << ping;

Output:

ping =0004089E

Zowel voor als na het restarten van het chatprogramma.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

das_phantom schreef op zondag 30 mei 2010 @ 17:36:
Dat klopt maar zoals ik het zie gebeurt er dit:

Na deze toewijzing gaat de compiler(?) naar uiteindelijk regel 54 en maakt hij gebruik van deze toewijzing. Vervolgens zorg ik door middel van Continue dat de compiler weer van voren begint met dit stuk omdat het onderdeel uitmaakt van een loop die hier niet te zien is. De compiler komt dan uiteindelijk weer bij regel 1 aan en maakt gebruik van zoals ik het zie dezelfde toewijzing.
Nee! Wat je doet is een nieuwe variabele maken. Die nieuwe variabele 'hide' de oude na regel 30, maar de code die ervoor staat maakt nog altijd gebruik van de andere ping variabele die al eerder gedefinieerd was.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int a = 34;
    std::cout << a << std::endl;

    if (true)
    {
        int a = 2;
        std::cout << a << std::endl;
    }

    std::cout << a << std::endl;
}

De uitvoer van dit programma is 34, 2, 34, en dus niet 34, 2, 2 zoals jij denkt. Dit komt omdat er een nieuwe 'a' wordt gemaakt binnen het if-blok, die vanaf de definitie van 'a' zichtbaar is. Daarbuiten is die 'a' niet meer binnen het huidige scope, en zal de buitenste 'a' weer zichtbaar zijn.

Overigens is de originele opmerking van Sebazzz dan ook wat ongelukkig verwoord:
Sebazzz schreef op zondag 30 mei 2010 @ 16:55:
Op regel 30 wijs je ping opnieuw toe.
Ping wordt helemaal niet opnieuw toegewezen, er wordt een nieuwe variabele gemaakt die toevallig ook ping heet.

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.


Acties:
  • 0 Henk 'm!

  • das_phantom
  • Registratie: December 2008
  • Laatst online: 09-08-2023
Dus omdat de "nieuwe" variable ping wordt aangemaakt binnen het if-blok is deze niet beschikbaarbaar voor code buiten het if blok?

Acties:
  • 0 Henk 'm!

  • Pronging
  • Registratie: Oktober 2007
  • Laatst online: 02-05-2021
Sleep(100000) is trouwens geen 10 min, in Java iig niet en het lijkt me in C++ ook niet.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, en dat zijn basic C++ scoping regels die je toch wel zou moeten kennen :). "HWND ping" is een definitie. Je maakt per definitie dus ook een nieuwe variabele.

.edit @ Pronging: idd, het is 100 seconden, oftewel 1 minuut en 40 seconden.

[ Voor 19% gewijzigd door .oisyn op 31-05-2010 02:13 ]

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.


Acties:
  • 0 Henk 'm!

  • das_phantom
  • Registratie: December 2008
  • Laatst online: 09-08-2023
Goede les, ik kan nu weer verder. Bedankt!

edit-

Ik heb zojuist de code veranderd in parent = Findwindow etc ipv HWND parent = Findwindow en nu werkt het wel.
Dit komt omdat het nu wel een toewijzing is ipv een definitie?

[ Voor 69% gewijzigd door das_phantom op 31-05-2010 02:34 ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 12:22

Sebazzz

3dp

.oisyn schreef op maandag 31 mei 2010 @ 01:23:
[...]

Overigens is de originele opmerking van Sebazzz dan ook wat ongelukkig verwoord:
[...]

Ping wordt helemaal niet opnieuw toegewezen, er wordt een nieuwe variabele gemaakt die toevallig ook ping heet.
Niet meer dan logisch, ik wist niet dat er een loop omheen stond. Dat is niet gezegd toen ik dat schreef.
Ik heb zojuist de code veranderd in parent = Findwindow etc ipv HWND parent = Findwindow en nu werkt het wel.
Dit komt omdat het nu wel een toewijzing is ipv een definitie
Klopt.

[ Voor 18% gewijzigd door Sebazzz op 31-05-2010 08:07 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]

Pagina: 1