ShellExecute problem z kompilacją

0

Witam mam oto taki kod którego nie mogę skompilować. Chciałbym wiedzieć dlaczego? A jak ktoś może to niech zamieści ten sam poprawiony kod. Będę bardzo wdzięczny. Dodam, że czytałem podobne tematy na forum i nic mi to nie dało. Proszę o nie dodawać odsyłaczy do innych stron. Jest to kod ze strony Microsoftu.

Problem:
-nie zadeklarowana zmienna handle,

Kompilator DEV C++

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HINSTANCE ShellExecute(
                           HWND hwnd,
                           LPCTSTR lpOperation,
                           LPCTSTR lpFile,
                           LPCTSTR lpParameters,
                           LPCTSTR lpDirectory,
                           INT nShowCmd
                           );
                           
                           ShellExecute(handle, NULL, "C:\przykladowy_program.exe", NULL, NULL, SW_SHOWNORMAL);
                           
    system("PAUSE");
    EXIT_SUCCESS;
}

 
0

Wywal tą deklarację funkcji...
A błąd jak sama nazwa wskazuje jest spowodowany tym, że nie zadeklarowałeś zmiennej handle, która jest typu HWND.
Tu masz dokumentację tej funkcji: http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx , a tam napisane czym jest ten pierwszy paramter:

hwnd [in, optional]

    Type: HWND

    A handle to the parent window used for displaying a UI or error messages. This value can be NULL if the operation is not associated with a window
0

Nie odsyłać Cię do innych stron, tak? Ale ja chętnie bym Cię odesłał do jakiegoś tutoriala z podstawami, w chwili obecnej lekcje "zmienne" oraz "funkcje" ;)
W wywołaniu shellexecute jest przekazana zmienna "handle" która jak widać nie jest nigdzie zadeklarowana, zresztą to samo mówi kompilator. W dodatku masz instrukcję "Typ=metoda" co jakąś ciut krzywą ideą jest.
Przeczytaj sobie co się podaje w tym parametrze.
Na stronie Microsoftu na której brak tej herezji którą pokazałeś

Po drugie, gdyż to wyżej było tym pierwszym, NIE używaj Deva, nie chce mi się tłumaczyć dlaczego więc powiem "Dev to zło", zainstaluj sobie albo Code::Blocks albo Visual Studio.

0

A po co ci najpierw deklaracja funkcji ShellExecute w main, a potem jej wywołanie?
Poza tym - kompilator ma tu rację - wywołujesz ShellExecute z parametrem "handle", którego nigdzie nie utworzyłeś.

1
#include <windows.h>
int main()
{
  ShellExecute(0, "open", "www.google.pl" , "" , "" , SW_MINIMIZE);
  return 0;
}
0

Chłopie wrzuciłeś deklarację funkcji (i to bibliotecznej) w maina i dziwujesz się czemu nie działa? Ucz się podstaw, a nie za WinAPI się bierzesz o_O

0
Sarrus napisał(a)

Chłopie wrzuciłeś deklarację funkcji (i to bibliotecznej) w maina i dziwujesz się czemu nie działa? Ucz się podstaw, a nie za WinAPI się bierzesz o_O

Ale zauważ, że taka deklaracja jest dopuszczalna. Można dzięki temu ustawić domyślne wartości argumentów ważne w określonym bloku kodu

0

Shalom o to mi właśnie chodziło. Jesteś wielki. I tak wracjąc do poprzedniego posta jakiś koleś mi kazał uczyć się podstaw. To raczej mi nie trzeba ;). Po prostu uczę się sam bo mój nauczyciel od informatyki trochę się nie zna na C++. Przyznaję może wyszystkiego nie wiem, ale dodam od siebie grę kółko i krzyżyk (komputer losuje przypadkowe pola prowizoryczne rozwiązanie bo jestem na wakacjach i leżę na plaży :P). Piszcię co o niej sądzicie. A WinApi uczę się od 2 dni także nie miejcie pretensji, że jestem w tym zielony. Pozdro

Kompilator: Code::Block

 //Radosław Bednarczyk IIc V Liceum Ogolnokształcące im. Haliny Poświatowskiej w Elblągu
//tel: 695 283 272 

#include <iostream>
#include <cstdlib> // służy do użycia funkcji rand
#include <time.h>

using namespace std;

    // deklaracja zmiennych globalnych
    
    int w, k;  // w wiersz k kolumna podaje uzytkownik
    int tab[4][4]; // tablica matemetyczna to na niej sa wszystkie obliczenia
    char plansza[4][4]; // tablica wizualna posłuży nam do wyświetlenia planszy
    int licznik_wolnych_miejsc = 0; // zliczmy do niej wolne miejsca w tablicy matematycznej
    bool wygrana_gracz = false; // wartosc logiczna ustawona wstepnie na flase gry wygramy przyjmuje wartosc true
    bool wygrana_komputer = false; // gry komputer wygra przyjnie wartość true 
    
void wypelniam_plansze(void) // funkcja dzieki której wypelnimy plansze spacjami a tab zerami
{
     for(int w=1;w<=3;++w)
             for(int k=1;k<=3;++k)
             {
                     plansza[w][k] = ' ';
                     tab[w][k] = 0;// nie trzeba wypelniac zerami ponieważ jest to tablica globalna typu integer 
                                   // i sama automatycznie wypełnia się zerami ale to tak dla pewności
             }
} 

void rysuje_plansze(void) // funkcja rozrysowująca plansze 
{
     for(int w=1;w<=3;++w)
    {
            for(int k=1;k<=3;++k)
            {  
                      cout<<plansza[w][k];
                      if(k<=2) // chcemy tylko 2 rozdzielenia
                      cout<<" ł"; // ten znak wyswietli kreske
            }        
                      
            if(w<=2) // chcemy tylko 2 kreski
            {        
                 cout<<'\n';
                 cout<<"--------";// rozdzielamy poziomy 
                 cout<<'\n';
            }
    }
}

void pobieram_wsp_gracz(void)// funkcja ktora pobiera wspolrzędne pola 
{   
    for(;;) // wykonuje się w kołko. Pętla zostanie przerwana gdy zostaną spełnione odpowiednie warunki
    {
        cout<<endl<<endl;   
           
        cout<<"Podaj nr wiersza: ";
        cin>>w; // wiersz
    
        cout<<"Podaj nr kolumny: ";
        cin>>k; // kolumna
        
        if(tab[w][k]==1 || tab[w][k]==2) // pole wstawione przez gracza w tab przyjmuje wart. 1 a przez komp. wart. 2 
        {                                // jezeli podamy wspolrzedne na ktorej znajduje się np 1. tzn, że pole jest zajęte przez 
                cout<<endl<<"  To pole jest zajete !"<<endl<<endl; // gracza itd i wyswietla komunikat
                cin.ignore();
        }
        
        else if(w>3 || k>3) // jeżeli podamy liczby wieksze nic 3 tzn. ,że wyszliśmy poza plansze a tak nie może być
        {
                cout<<endl<<"   Podales bledne pole !"<<endl<<endl;
                cin.ignore();
        }
        
        else if(tab[w][k]!=1 || tab[w][k]!=2 ) // nie wyjdzie z pętli dopuki nie dostanie odpowiednich wspołrzędnych
              break; // wszystko się zgadza więc wychodzimy z pętli
    }
    plansza[w][k] = 'X'; // planszy przypisujemy X i zamiast istniejącej tam spacji 
    tab[w][k] = 1; // oraz wart. 1 (gracz) dla tab mat. w to samo miejsce 
}

void pobieram_wsp_komputer(void) // funkcja odpowidająca za ruchy komputera
{
     srand(time(NULL)); // inicjacja losowania róznych pól
     
     int ruch_w; // zmienna która przyjmie wartość wylosowanego wiersza
     int ruch_k; // -||- kolumny
     
     for(;;) // pętelka nieskończona wyjdziemy z niej kiedy zostaną spełnione poniższe warunki
     {
         const int a = 1; // losujemy pola z
         const int b = 3; // przedziału <1;3>
         
         if(licznik_wolnych_miejsc == 1)// jezeli licznik wonych miejsc jest rowny jeden to wychodzimy z pętli
               break;              // ponieważ ostatni ruch ma komputer no chyba że użytkownik zajmie ostatnie pole
         do
         {
             ruch_w = a + rand() % (b-a+1);
             ruch_k = a + rand() % (b-a+1);
     
         }while(tab[ruch_w][ruch_k]==1 || tab[ruch_w][ruch_k]==2); // losujemy pole dópki będą inne niż te co są zajęte    
              
         break; // i wychodzimy                                     
     }
          
     plansza[ruch_w][ruch_k] = 'O'; // na planszy wstawiomy ZNAK O i podmieniamy go z istaejącą w tym miejscu spacją
     tab[ruch_w][ruch_k] = 2; // i zapisujemy ruch na planszy mat. o wartości 2 w wylosowanycm wolnym miejscu
} // więc jak już pewnie się domyśleliście jest to prowizoryczne rozwiązanie, ale jestem na wakacjach i nie wysilam się za bardzo :P
  // możena inny możejszy sposób zastosować
void sprawdzam(void)// funcja sprawdzająca czy ktoś wygrał
{
     if(tab[1][1]==1 && tab[1][2]==1 && tab[1][3]==1){wygrana_gracz = true;}; // jeżeli jedynka znajduje się na takich polach 
     if(tab[2][1]==1 && tab[2][2]==1 && tab[2][3]==1){wygrana_gracz = true;}; // to znczy że WYGRAŁ
     if(tab[3][1]==1 && tab[3][2]==1 && tab[3][3]==1){wygrana_gracz = true;};
     if(tab[1][1]==1 && tab[2][1]==1 && tab[3][1]==1){wygrana_gracz = true;};
     if(tab[1][2]==1 && tab[2][2]==1 && tab[3][2]==1){wygrana_gracz = true;};
     if(tab[1][3]==1 && tab[2][3]==1 && tab[3][3]==1){wygrana_gracz = true;};
     if(tab[1][1]==1 && tab[2][2]==1 && tab[3][3]==1){wygrana_gracz = true;};
     if(tab[1][3]==1 && tab[2][2]==1 && tab[3][1]==1){wygrana_gracz = true;};    
  
     if(tab[1][1]==2 && tab[1][2]==2 && tab[1][3]==2){wygrana_komputer = true;}; // jeżeli dwójka znajduję się na takich polach 
     if(tab[2][1]==2 && tab[2][2]==2 && tab[2][3]==2){wygrana_komputer = true;}; // tzn. ze komputer wygrał i zmienna wygrana 
     if(tab[3][1]==2 && tab[3][2]==2 && tab[3][3]==2){wygrana_komputer = true;}; // przyjmuje true KOMPUTER WYGRAŁ
     if(tab[1][1]==2 && tab[2][1]==2 && tab[3][1]==2){wygrana_komputer = true;};
     if(tab[1][2]==2 && tab[2][2]==2 && tab[3][2]==2){wygrana_komputer = true;};
     if(tab[1][3]==2 && tab[2][3]==2 && tab[3][3]==2){wygrana_komputer = true;};
     if(tab[1][1]==2 && tab[2][2]==2 && tab[3][3]==2){wygrana_komputer = true;};
     if(tab[1][3]==2 && tab[2][2]==2 && tab[3][1]==2){wygrana_komputer = true;};
     
     if(wygrana_gracz == true) // jeżeli wygrana gracza to wyświetli się kominikat poniżej
     {
                            cout<<endl<<endl<<"    BRAWO WYGRALES :D !"<<'\a'<<endl<<endl;
                            cin.ignore();
     }
     
     if(wygrana_komputer == true) // jeżeli wygrał komputer to wyświetli się kominikat poniżej
     {
                            cout<<endl<<endl<<"    PRZEGRALES 8( !"<<'\a'<<endl<<endl;
                            cin.ignore();
     }
     
     if(licznik_wolnych_miejsc == 0 && wygrana_gracz == false && wygrana_komputer == false) // remis jeżeli brak miejsc i nikt nie trafił 
     {                                                                                      // w odpowiedni ruch
                               cout<<endl<<endl<<"    REMIS !"<<'\a'<<endl<<endl;
                               cin.ignore();
     }
                       
} 
      
int main()
{              cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
               cout<<'\t'<<"                     TIC TAC TOE"<<endl<<endl;
               cout<<'\t'<<"                 Push ENTER, to START "<<endl<<endl;
               cout<<'\t'<<"             Autor: Radek Bednarczyk (DYDOL)";
                
               cin.ignore();
               
               wypelniam_plansze();
               
    for(;;) // gramy dopuki nie padnie wygrana, przegrana lub remis
    {          
               system("CLS");// czyszczenie planszy
               
               licznik_wolnych_miejsc=0; // po każdym obiegu wstępnie przujmuje wartość zero, żeby się nie sumowały
               
               for(int w=1;w<=3;++w)
                 for(int k=1;k<=3;++k)
                   if(tab[w][k]==0)
                     ++licznik_wolnych_miejsc; // zliczamy ile jest jest wolnych miejsc w tab matematycznej
                     
                
               rysuje_plansze(); // rysuje plansze
               sprawdzam(); // odrazu sprawdzamy czy ktos nie wygrał
               
               cout<<endl;
                              
               if(wygrana_gracz==true || wygrana_komputer==true || licznik_wolnych_miejsc == 0 ){break;}; // i wychodzmy
               
               pobieram_wsp_gracz(); // pobieramy współrzędne gracza
               pobieram_wsp_komputer(); // -||- od kompiutera
    }
    
    cout<<endl;
    
    system("PAUSE"); // koniec
    EXIT_SUCCESS; 
}

    
    
    
 
    
    
    
0

Problem rozwiązany proponuje usunąć temat ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1