HFONT hFont = GetStockObject (DEFAULT_GUI_FONT) ;
Tuo aiheuttaa virheen:
67 C:\unzipped\koodit\rivinlisays.cpp invalid conversion from `void*' to `HFONT__*'
Pitääkö ladata jotain kirjastoja?
Ei, vaan lisätä väliin tyypinmuunnos (HFONT), kuten virhe kertoo.
Ei tuo tyyppimuunnos minulta onnistunut. Miten se pitää tehdä?
Tuo virhe siis mitä luultavimmin tarkoittaa, että GetStockObject-funktio palauttaa void* -tyyppisen arvon, jota sitten yrität sijoittaa HFONT -tyyppiseen (ilmeisesti alias HFONT__* -tyypille) muuttujaan. Tämä ei tietenkään onnistu suoraan, vaan sinun täytyy eksplisiittisellä tyyppimuunnoksella kertoa kääntäjälle, että kyseinen muunnos on sallittu. Siis tähän tyyliin:
HFONT hFont = (HFONT)GetStockObject (DEFAULT_GUI_FONT);
Kiitos!
Siitä selvittiin. Koodissa näyttää olevan edelleen vikoja, jotka ei sovi Dev-Cpp:lle. Ilmoittaa nyt riviltä 109, joka on:
hwndStatus = CreateWindowEx ( NULL, STATUSCLASSNAME, "Aloita...", WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, 0, 0, 0, 0,hwnd, (HMENU) 7, hInstance, NULL ) ;
Kyseessä on tuo alin rivi ja HWND
Virheilmoitus:
C:\unzipped\koodit\rivinlisays.cpp:109: warning: passing NULL used for non-pointer converting 1 of `HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)'
Miten tuosta oikein selviää?
Eli tuosta virheilmoituksestahan selviää funktion prototyyppi:
HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)
Tuossa tuo DWORD-tyyppi ei taida olla osoitin, vaan oikeastaan puhdas kokonaisluku. (En ole pahemmin tuollaista windows-ohjelmointia harrastanut, joten en tuota mene kyllä vannomaankaan.)
Sitten siinä virheilmoituksessa myöskin sanotaan: passing NULL used for non-pointer Eli yrität syöttää NULL-arvoa (joka on osoitintyyppinen vakio) ei-osoitin-parametriksi. Ja kun katsotaan sitä koodiasi:
hwndStatus = CreateWindowEx ( [b]NULL[/b], STATUSCLASSNAME, "Aloita...", WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, 0, 0, 0, 0,hwnd, (HMENU) 7, hInstance, NULL ) ;
, niin niinhän siinä tosiaan näyttää ensimmäisen parametrin kohdalla käyvän. Eli kokeileppas laittaa siihen ekan NULL-arvon tilalle pelkkä 0 (nolla), niin ehkäpä tuostakin varoituksesta päästään eroon.
Ja tuohan siis tosiaan oli varoitus (warning) eikä virhe (error). Erona näillä on mm. se, että virheellinen ohjelma ei käänny, mutta pelkkiä varoituksia tuottava koodista sen sijaan saadaan kyllä toimiva ohjelma. Eria asia sitten onkin, että kuinka se toimii, joten niistä varoituksista kannattaa kyllä pyrkiä eroon...
Kiitos.
Sain myös riviltä 127 toimimaan muuttamalla kaikki NULL arvot nolliksi.
Nyt on edennyt riville 135.
SendMessage (hwnd, WM_COMMAND, MAKEWPARAM(5, BN_CLICKED),0) ;
Tässäkin ei huolinut NULL arvoa, joten muutin siihen 0. Mutta nyt se ei tee mitään...
Ilmoittaa:
Compiler: Default compiler Executing g++.exe... g++.exe "C:\unzipped\koodit\rivinlisays.cpp" -o "C:\unzipped\koodit\rivinlisays.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -lsdk C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lsdk collect2: ld returned 1 exit status Execution terminated
Ei varsinaista virheilmoitusta, mutta jotain häikkää...
Onko tuo paketti oikea, imuroin jostakin sellaisen kuin OpenAL SDK.DevPak
Tuossahan se virhe näkyy selkeästi:
C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lsdk
Eli yrität linkittää kirjastoa sdk (etsii tiedostoa libsdk.a tai mikä onkaan winukassa) mutta sitä ei löydy. Vaikuttaisi siltä että teet WinAPI:lla jotain. Katso package managerilla että WinAPI:iin liittyvät jutut on asennettu, ja sen jälkeen aloita uusi Windows application -projekti (tms, ei nyt ole Dev-C++:aa tässä että voisin kattoo) jonka pitäisi laittaa linkkeriasetukset kuntoon.
Windows32API on asennettu. Eikö tuo tuossa tarvitse SDK:ta?
Kuten sanoin, olen asentanut OpenAL.DevPakin, jonka mukana tuli OpenAL SDK ja myös tuo -lsdk komento on suoritettu, ohjelmakin näkyy sen suorittavan automaattisesti.
Mitä tuon eteen tulisi tehdä? Mikä on oikea komento tuolle kirjastolle? Onkon se oikea tähän tarkoitukseen?
Olen ladannut monia muitakin DevPak-paketteja, mutta kun ei ole tietoa, millä komennolla ne ladataan.
Huomasin juuri, että viimeisin Compiler Options-komento jää DevCpp:n muistiin. Kun poistin kentässä olevan tekstin ja poistin ruksin kohdasta "Add these commands when calling compiler" ilmoitti Link_error virheestä, kun yritin kääntää:
[Linker error] undefined reference to `InitCommonControls@0' [Linker error] undefined reference to `GetStockObject@4' C:\DOCUME~1\Pekka\LOCALS~1\Temp/cckfcaaa.o(.text+0x1d1):rivinlisays.cpp: undefined reference to `GetStockObject@4' collect2: ld returned 1 exit status
Mitähän tuo oikein kaipaa?
Voisi laittaa nuo kääntäjävirheet lainauksiksi eikä koodeiksi. Ei ole kiva, kun leiska räjähtää :(
Mitään sdk-kirjastoa tuskin on olemassakaan. Kannattaa sieltä SDK:n helpistä katsoa funktion kohdalta, minkä kirjaston se haluaa. Sieltä selviää esimerkiksi, että InitCommonControls löytyisi (Microsoftilla) kirjastosta comctl32.lib. MinGW:n vastaava on todennäköisesti libcomctl32.a, joka linkitetään parametrilla -lcomctl32. Toisen osaatkin varmasti itse etsiä samalla periaatteella.
Metabolix kirjoitti:
MinGW:n vastaava on todennäköisesti libcomctl32.a, joka linkitetään parametrilla -lcomctl32. Toisen osaatkin varmasti itse etsiä samalla periaatteella.
En tiedä, olenko luottamuksesi arvoinen :)
Olen aivan aloittelija...
Onko niin, että tuo linkitys toimii sen mukaan, että jos tiedoston nimi lib-hakemistossa on esim libpekka.a, se linkitetään -lpekka ?
Ja tuossa linkityshommassa on kaksi kenttää, onko sama kumpaan kenttään kirjoittaa tuon homman ja tartteeko checkbox olla ruksattu, jotta linkitys toimii?
Pekka Mansikka kirjoitti:
Onko niin, että tuo linkitys toimii sen mukaan, että jos tiedoston nimi lib-hakemistossa on esim libpekka.a, se linkitetään -lpekka?
On.
Sain tämän nyt toimimaan. Vaati seuraavat kirjastot:
Dev-C++ kirjoitti:
-lcomctl32 -lgdi32
Opin taas sen verran lisää tästä ohjelmasta, että joka ohjelmalle joutuu erikseen ajamaan nuo linkitykset, sillä tuo -lgdi32 on ajettu ekakerran jo muutama päivä sitten, kun selvitin Link_errorin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.