Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Toimii VC++ 2010:lla mutta ei 2008:lla

hohoo [23.07.2011 22:55:41]

#

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

Metabolix [23.07.2011 23:15:41]

#

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ä.

hohoo [23.07.2011 23:57:34]

#

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)

Metabolix [24.07.2011 00:20:31]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta