en saa käännettyä tätä ohjelmaa,ja kääntäjäni sanoo:
--------------------Configuration: ikkuna - Win32 Debug--------------------
Compiling...
ikkuna.cpp
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(10) : error C2731: 'WinMain' : function cannot be overloaded
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(9) : see declaration of 'WinMain'
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(17) : error C2065: 'szOhjelmanNimi' : undeclared identifier
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(17) : error C2440: '=' : cannot convert from 'int' to 'const char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(18) : error C2440: '=' : cannot convert from 'void *' to 'struct HINSTANCE__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(23) : error C2065: 'GetStockPbject' : undeclared identifier
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(23) : error C2440: '=' : cannot convert from 'int' to 'struct HBRUSH__ *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(39) : error C2660: 'GetMessageA' : function does not take 3 parameters
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(39) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
ikkuna.obj - 8 error(s), 0 warning(s)
*********************************************
Tässä on itse ohjelma:
#include
//CALLBACK-funktion esittely
LONG CALLBACK IkkunaOhjelma(HWND, UINT, WPARAM, LPARAM) ;
char lpszOhjelmanNimi[] = "OmaOhjelma";
//Pääfunktio
int WINAPI WinMain(HANDLE hInst,HANDLE hPreInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd; //Ikkunan handle
MSG msg; //Viesti kenttä
WNDCLASS omaluokka; //Ikkunaluokka
if (!hPreInst)
{
omaluokka.lpszClassName = szOhjelmanNimi;
omaluokka.hInstance = hInst;
omaluokka.lpfnWndProc = (WNDPROC) IkkunaOhjelma;
omaluokka.hCursor = LoadCursor(NULL, IDC_ARROW);
omaluokka.hIcon = NULL;
omaluokka.lpszMenuName = NULL;
omaluokka.hbrBackground = GetStockPbject (WHITE_BRUSH);
omaluokka.style = CS_HREDRAW | CS_VREDRAW;
omaluokka.cbClsExtra = 0;
omaluokka.cbWndExtra = 0;
if (RegisterClass (&omaluokka) == 0)
return FALSE;
}
//Luo ikkuna
hwnd = CreateWindow ( szOhjelmanNimi,"Ikkuna",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hInst, NULL) ;
ShowWindow (hwnd, nCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0 ))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return TRUE;
}
//callback.funktio alkaa tästä
LONG APIENTRY IkkunaOhjelma(HWND hwnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
switch (messg)
{
case WM:CREATE: //ikkuna luotu
break;
case WM_DESTROY: //ikkuna tuhotaan
PostQuitMessage (0);
break;
default:
return (DetWindowProc (hwnd, messg, wParam, lParam));
}
return 0L;
}
--------------------Configuration: ikkuna - Win32 Debug--------------------
Compiling...
ikkuna.cpp
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(10) : error C2731: 'WinMain' : function cannot be overloaded
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(9) : see declaration of 'WinMain'
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(17) : error C2065: 'szOhjelmanNimi' : undeclared identifier
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(17) : error C2440: '=' : cannot convert from 'int' to 'const char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(18) : error C2440: '=' : cannot convert from 'void *' to 'struct HINSTANCE__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(23) : error C2065: 'GetStockPbject' : undeclared identifier
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(23) : error C2440: '=' : cannot convert from 'int' to 'struct HBRUSH__ *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(39) : error C2660: 'GetMessageA' : function does not take 3 parameters
C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(39) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
ikkuna.obj - 8 error(s), 0 warning(s)
*********************************************
Tässä on itse ohjelma:
#include
//CALLBACK-funktion esittely
LONG CALLBACK IkkunaOhjelma(HWND, UINT, WPARAM, LPARAM) ;
char lpszOhjelmanNimi[] = "OmaOhjelma";
//Pääfunktio
int WINAPI WinMain(HANDLE hInst,HANDLE hPreInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd; //Ikkunan handle
MSG msg; //Viesti kenttä
WNDCLASS omaluokka; //Ikkunaluokka
if (!hPreInst)
{
omaluokka.lpszClassName = szOhjelmanNimi;
omaluokka.hInstance = hInst;
omaluokka.lpfnWndProc = (WNDPROC) IkkunaOhjelma;
omaluokka.hCursor = LoadCursor(NULL, IDC_ARROW);
omaluokka.hIcon = NULL;
omaluokka.lpszMenuName = NULL;
omaluokka.hbrBackground = GetStockPbject (WHITE_BRUSH);
omaluokka.style = CS_HREDRAW | CS_VREDRAW;
omaluokka.cbClsExtra = 0;
omaluokka.cbWndExtra = 0;
if (RegisterClass (&omaluokka) == 0)
return FALSE;
}
//Luo ikkuna
hwnd = CreateWindow ( szOhjelmanNimi,"Ikkuna",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hInst, NULL) ;
ShowWindow (hwnd, nCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0 ))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return TRUE;
}
//callback.funktio alkaa tästä
LONG APIENTRY IkkunaOhjelma(HWND hwnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
switch (messg)
{
case WM:CREATE: //ikkuna luotu
break;
case WM_DESTROY: //ikkuna tuhotaan
PostQuitMessage (0);
break;
default:
return (DetWindowProc (hwnd, messg, wParam, lParam));
}
return 0L;
}
Vastaukset 8
Vanhimmat
http://www.functionx.com/win32/Lesson10.htm
Ootko edes yrittänyt ekana tutkia tuota kirjoitusvirheiden osalta?
olen yrittänyt ja korjasinkin yhden virheen, mutta näitä en osanut
En jaksa tuosta alkaa etsimään kaikkia mahdollisia vikoja:)
Mureakuhassa on ihan ok windows ohjelmointi tutoriaali. Ota valmis pohja täältä sen tiedän ainakin toimivan kun olen joskus kokeillut ;)
http://cpp.mureakuha.com/
täytyy hankkia BORLAND, mulla on nimittäin visual c 6. ja se käyttää eri callback.kutsua
Tuossapa näin muutaman virheen (eikä edes kääntää nyt käytössä ;) )
// 1)
// WinMain funktion parametrina pitää antaa HINSTANCE ei (HANDLE), veikkaus!
// 2)
omaluokka.lpszClassName = szOhjelmanNimi;
// Pitäs olla: omaluokka.lpszClassName = lpszOhjelmanNimi;
// 4)
GetStockPbject
// pitäis kirjoittaa varmaanki (HBRUSH)GetStockObject(WHITE_BRUSH);
// 5) GetMessage funktiolle menee 4 parametria
// while (GetMessage (&msg, NULL, 0, 0 ))
Muista virheistä vaikee sanoa, koska en näe rivinumeroita.
Tätä virheenmetsästystä kannattas harjoitella, sillä sitä ohjelmoinnissa piisaa &)
Uudempien kääntäjien mukana on muuttunut tuo windows määrittely, joten joutuu muuttamaan noita vanhoja malleja...toisaalta haluatko oikeasti lähteä rakentamaan puhtaan win apin päälle ilman luokkakirjastoja ?
Mikäli niin otappa pezoltin paksu oopus käyttöön, löytyy myös suomenkielisenä ja kopsaa sieltä malli miten winmain toteutetaan. http://www.charlespetzold.com/ esim: Programming Windows ja sen käännökset.
ja tietysti netti on täynnä mallisuorituksia winmainin osalta, esim tässä:
http://www.cprogramming.com/tutorial/gl4.html
En ole koodannut C:tä valovuosiin, mutta tässä ois pari arvausta nyt ihan noiden virheiden perusteella.
"C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(10) : error C2731: 'WinMain' : function cannot be overloaded "
WinMain-funktiota ei voi ylikuormittaa. Yrität siis käyttää sitä niin, että jokin parametri puuttuu tai sulla on niitä liikaa/väärän tyyppisiä.
Jos funktio on tyyppiä:
void blaaBlaa(int i, String str, char a)
niin ei sitä voi käyttää näin
int keke = blaaBlaa("JIPPII")
"C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(17) : error C2065: 'szOhjelmanNimi' : undeclared identifier "
Sulla ei oo tuon nimistä muuttujaa esiteltynä. Kirjoitusvirhe siis.
Sitte nämä cannot convert from blaablaa to blaablaa.
Yrität castata tietotyypistä toiseksi niin, että se ei ole mahdollista. Osassa näyttää olevan vielä kirjoitusvirheitäkin.
intistä yrität castata voidiksi tai pointeriksi tai const charriksi.
Johtuu varmaan noista omaluokka.jotain = jotainMuuta
Eli omaluokka.jotain on vaikka tyyppiä int ja yrität siihen laittaa jollain funktiolla jotain muuta päälle.
Esmes jos omaluokka.lpszClassName on tyyppiä const char (ei siis voi muuttaa), niin ei siihen päälle voi viedä mitään uutta nimeä. Const == ei saa muuttaa
"'GetStockPbject' : undeclared identifier "
Oisko ehkä GetStockObject?
"cannot convert from 'int' to 'struct HBRUSH__ *' "
Taas sama tilanne ku aikaisemmissa. Sulla on joku muuttuja tyyppiä int ja yrität laittaa siihen structia päälle tms. Sun pitää kattoa mitä noi funktiot oikeen palauttaa.
"C:\Documents and Settings\Aleksander.ALLUNKONE\Työpöytä\c \ohjelmat\WINDOWS\ikkuna2\ikkuna.cpp(39) : error C2660: 'GetMessageA' : function does not take 3 parameters "
No mitä siinä lukee? Funktio ei ota kolmea parametriä. Kuitenki käytät sitä kolmella parametrilla.
GetMessage (&msg, NULL, 0 ))
Noista ika moni ratkee nyt sillä, että eka katot miten tuolla omaluokassa on muuttujat määritelty.
Eli jos omaluokka.luku on tyyppiä int, niin ei voi käyttää jotain
omaluokka.luku = palautaString("ekeke");
jos tuo metodi palauttaa stringin tms.
Eikä välttämättä toimi edes suorat castaukset
omaluokka.luku = (int)palautaString("keke");
jos kääntäjä ei tollasta castausta osaa tehdä.
Pari virhettä lähtee heti, kun tarkistat oikeinkirjoituksen.
Kannattaa käyttää jotain sovelluskehitintä, joka huutaa heti jostain kirjoitusvirheistä.