Miksi tämä koodi kääntyy VC++ 2010:lla mutta ei 2008:lla?
http://www.qtcentre.org/threads/26974-Qt-and-windows-7-new-Api?p=128880#post128880
2008:lla käännettäessä tulee läjä virheilmoituksia, mm.:
ProgressDialog.h:31: error: C2143: syntax error : missing ';' before '*'
ProgressDialog.h:31: error: C4430: missing type specifier - int assumed. Note: C++ does not support default-int
ITaskbarList3 * taskbar;
ProgressDialog.cpp:38: error: C2039: 'taskbar' : is not a member of 'ProgressDialog'
HRESULT hr = CoCreateInstance(CLSID_TaskbarList, 0, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( & this->taskbar));
Kaikki virheet:
..\taskbar2\ProgressDialog.h(31) : error C2143: syntax error : missing ';' before '*' ..\taskbar2\ProgressDialog.h(31) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int ..\taskbar2\ProgressDialog.h(31) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int ..\taskbar2\ProgressDialog.cpp(38) : error C2039: 'taskbar' : is not a member of 'ProgressDialog' ..\taskbar2\ProgressDialog.h(10) : see declaration of 'ProgressDialog' ..\taskbar2\ProgressDialog.cpp(38) : error C2039: 'taskbar' : is not a member of 'ProgressDialog' ..\taskbar2\ProgressDialog.h(10) : see declaration of 'ProgressDialog' ..\taskbar2\ProgressDialog.cpp(69) : error C2039: 'taskbar' : is not a member of 'ProgressDialog' ..\taskbar2\ProgressDialog.h(10) : see declaration of 'ProgressDialog' ..\taskbar2\ProgressDialog.cpp(69) : error C2227: left of '->SetProgressState' must point to class/struct/union/generic type ..\taskbar2\ProgressDialog.cpp(69) : error C2065: 'TBPF_NORMAL' : undeclared identifier ..\taskbar2\ProgressDialog.cpp(83) : error C2039: 'taskbar' : is not a member of 'ProgressDialog' ..\taskbar2\ProgressDialog.h(10) : see declaration of 'ProgressDialog' ..\taskbar2\ProgressDialog.cpp(83) : error C2227: left of '->SetProgressValue' must point to class/struct/union/generic type
Onko se yksinkertaisesti niin, että VC++ 2008 ei tue Windows 7:n tehtäväpalkin kilkkeitä? Mutta miten sitten Firefoxissa ne toimii, vaikka tietääkseni Firefox käännetään VC++ 2005:llä?
IDE: Qt Creator 2.2.1
Qt-versiot:
4.7.3 VC++ 2008
4.8.0 beta VC++ 2008
4.8.0 beta VC++ 2010
Virheistä päätellen ohjelmasta puuttuvat ITaskbarList3 ja TBPF_NORMAL. Ongelma ei ole itse kääntäjän syy, vaan vika on joko liian vanhoissa otsikkotiedostoissa tai asetuksissa. Ensimmäisessä tapauksessa voisit luultavasti vain kopioida oikeat otsikkotiedostot uudesta versiosta vanhaan. Jälkimmäisessä tapauksessa pitää säätää asetuksista, että kohteena on Windows 7, jotta kääntäjä ottaa mukaan otsikkotiedostoista myös uudet asiat. Asetus onnistunee seuraavalla rivillä kooditiedostojen alussa (ennen WinAPI:n include-rivejä):
#define _WIN32_WINNT 0x0601
Lisätietoa MSDN:ssä.
Kokeilin includettaa uudet otsikot koko polulla:
#include <C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\windows.h> #include <C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\shobjidl.h> #include <C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\Objbase.h>
Tuli 306 virhettä ocidl.h:sta, eli kopiointi uudesta vanhaan ei taida olla hyvä idea.
(Toimii 2010:ssa)
Niissä tiedostoissa on edelleen viittauksia toisiin tiedostoihin, joita ei tuolla tavalla löydy. Sen sijaan ohjelmasta tulee epämääräinen sekoitus uusia ja vanhoja otsikkoja. Jos haluat kokeilla kopiointia, kokeile kunnolla: ota koko include-hakemisto talteen ja korvaa toisella.
Aihe on jo aika vanha, joten et voi enää vastata siihen.