C++ na Win a chyba poblíž case

webhope

C++ na Win a chyba poblíž case
« kdy: 22. 10. 2013, 17:59:01 »
Zdravím, začínám s C++. Snažím se z jedné opensource vytáhnout kód na dekomprimování souboru.

Může mi někdo pomoci s odstraněním těchto chyb? Asi mají stejnou příčinu.

Kód: [Vybrat]
error C2065: 'PSCB_PRECREATE' : undeclared identifier
error C2051: case expression not constant
error C2065: 'PSCB_INITIALIZED' : undeclared identifier
error C2051: case expression not constant
error C2065: 'TOOLTIPS_CLASS' : undeclared identifier
error C3861: 'TooltipInit': identifier not found
error C2065: 'PROPSHEETHEADER' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'header'
There is this code:

Kód: [Vybrat]
int CALLBACK PropSheetProc(HWND sheet, UINT msgid, LPARAM lParam)
{
    switch (msgid)
    {
    case PSCB_PRECREATE:
        {
            DLGTEMPLATE *templ = (DLGTEMPLATE*)lParam;

            templ->cy += 5;
slovo PSCB_PRECREATE jsem v projektu našel jenom jednou, takže nechápu smysl té hlášky.

A pak se objevuje chybová hláška v souvislostí s funkci
HWND MakeSheet(HINSTANCE app)
Kód: [Vybrat]
error C2065: 'header' : undeclared identifier
For this line:
PROPSHEETHEADER header;


'PSH_MODELESS' : undeclared identifier
error C2065: 'PSH_USECALLBACK' : undeclared identifier
error C2065: 'PSH_NOAPPLYNOW' : undeclared identifier
error C2065: 'PSH_NOCONTEXTHELP' : undeclared identifier
error C2065: 'PSH_USEICONID' : undeclared identifier
error C2065: 'header' : undeclared identifier

Looks similar

Code:
http://paste.ofcode.org/35B57JYGkaJDnct4UkDfGcB
« Poslední změna: 22. 10. 2013, 18:15:48 od Petr Krčmář »


eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:C++ na Win a chyba poblíž case
« Odpověď #1 kdy: 22. 10. 2013, 18:26:04 »
slovo PSCB_PRECREATE jsem v projektu našel jenom jednou, takže nechápu smysl té hlášky.

To možná bude ta příčina - mělo by tam být minimálně 2x - jednou deklarované a jednou použité. Nechybí Ti nějaký hlavičkový soubor nějaké knihovny? Co to je za aplikaci a jaké má závislosti (zpravidla se uveřejňují na stránkách té aplikace)?

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #2 kdy: 22. 10. 2013, 18:54:16 »
No ale vono tam je vážně jenom jednou. A předtím to jelo bezproblému než jsem tam teda udělal ty změny.

Mohl by ses prosím tě podívat, na ten originál?
http://www.mediafire.com/download/o5yo6o6t91bpcix/aokts-1.0.1_rev-70.zip#!
Je to AOK Trigger Studio v1.0.1 rev70

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #3 kdy: 22. 10. 2013, 19:04:22 »
a jedná se o soubor view/aokts.cpp
v originálním projektu jsem našel jednu chybu a to, že je nutno includovat
Kód: [Vybrat]
#include <iterator>     // std::back_inserter
hned za #include <functional>
to jen kdyby si to zkoušel spustit.

danielsoft

Re:C++ na Win a chyba poblíž case
« Odpověď #4 kdy: 22. 10. 2013, 19:06:21 »
zkusil jsem googlit PSCB_PRECREATE a podle tohoto

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760815(v=vs.85).aspx

se má includnout Prsht.h - máš to tam?


webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #5 kdy: 22. 10. 2013, 19:22:06 »
Nevím co znamená to header ... Prsht.h
ale autor to v tom originálním projektu nemá a přesto jim to jede... Přijde na to někdo v jakto že mu to jede a mě ne? A jde o to, že ono těch chybových hlášek je více

error C2065: 'PSCB_PRECREATE' : undeclared identifier
error C2051: case expression not constant
error C2065: 'PSCB_INITIALIZED' : undeclared identifier
error C2051: case expression not constant
error C2065: 'TOOLTIPS_CLASS' : undeclared identifier
error C3861: 'TooltipInit': identifier not found
error C2065: 'PROPSHEETHEADER' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'header'

'PSH_MODELESS' : undeclared identifier
error C2065: 'PSH_USECALLBACK' : undeclared identifier
error C2065: 'PSH_NOAPPLYNOW' : undeclared identifier
error C2065: 'PSH_NOCONTEXTHELP' : undeclared identifier
error C2065: 'PSH_USEICONID' : undeclared identifier
error C2065: 'header' : undeclared identifier

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #6 kdy: 22. 10. 2013, 20:52:51 »
Ještě se chci zeptat na toto... Jelikož studuju tento článek
http://www.builder.cz/rubriky/c/c--/ucime-se-winapi-3--156008cz
jak vytvořit okno, zajímá mě, jestli je nutné pro vytvoření aplikace win32 vytvářet okno?
Tam se píše, že pomocí CreateWindowEx se vytváří okno. Ve v originálu zmiňovaného projektu, viz výše, se objevuje tvorba oken pomocí CreateWindowEx a CreateWindow a to pro tooltip (TOOLTIPS_CLASS), stavový řádek (STATUSCLASSNAME). V celém projektu se žádné jiné okna nevytváří. Alespoň jsem tedy nenašel další slova začínající na CreateWindow a obsahující tyto klíčové slova.

Takže proto se ptám, mě přijde divné, že se nikde nevytváří okno aokts (tak se jmenuje aplikace). Je to normální? Nebo se okno dá nahradit něčím jiným, například použitím PropSheetData? Protože vidím že v PropSheetData se nachází stavový řádek, menu, prohlížeč mapy, ale nevidím že by jeho součástí byly listy (stránky) aplikace.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:C++ na Win a chyba poblíž case
« Odpověď #7 kdy: 22. 10. 2013, 21:01:13 »
Zrovna Prsht.h tam k tomu projektu přilinkován je ;-)

V čem to kompiluješ? Ve Visual Studiu? Je tam pro to přímo připravený .sln soubor, pro verzi 2005. Mně kompilace ve 2012 padá na tom, že 1 parametrický konstruktor std::bad_alloc není přístupný. Kdybych měl nainstalovaný kompilátor, který používá verze 2005, pravděpodobně by to asi buildnout šlo.

Každopádně má to pro Tebe nějaký hlubší smysl? Ten kód není špatně napsaný, ale ukázka "best practices" to taky není.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:C++ na Win a chyba poblíž case
« Odpověď #8 kdy: 22. 10. 2013, 21:07:57 »
Nutné to není. Např. takové ty oblíbené tiché instalace/samorozbalovací archivy/spouštěče nevytváří okno - ani windowsovské, ani konzolové. Každopádně začínat s C++ tím, že hrabeš rovnou na Win32 API ... chlape to je jak kdyby horolezec začínal tím, že by lezl na K2.

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #9 kdy: 22. 10. 2013, 22:38:58 »
eMko
Citace
Zrovna Prsht.h tam k tomu projektu přilinkován je ;-)

V čem to kompiluješ? Ve Visual Studiu? Je tam pro to přímo připravený .sln soubor, pro verzi 2005. Mně kompilace ve 2012 padá na tom, že 1 parametrický konstruktor std::bad_alloc není přístupný. Kdybych měl nainstalovaný kompilátor, který používá verze 2005, pravděpodobně by to asi buildnout šlo.


Prosím tě kde? Já ten soubor nemohu najít. Používám Visual Studio 2010 Express a většina programátorů co používá AOKTS (ti mi s tím neporadili) to používá taky.

No tak K2 to snad ne. Rozdíl je v tom že si mohu dovolit metodu pokus omyl. Já jen vyhazuju co nepotřebuju. Nepotřebuju ty okna, mě jde jen o to, aby to byla tichá aplikace, skrytá, s možnosti vyhodit chybu pokud selže načítání souboru.

Kde je ten soubor?

Michal Kovacic

Re:C++ na Win a chyba poblíž case
« Odpověď #10 kdy: 22. 10. 2013, 23:29:28 »
Nutné to není. Např. takové ty oblíbené tiché instalace/samorozbalovací archivy/spouštěče nevytváří okno - ani windowsovské, ani konzolové. Každopádně začínat s C++ tím, že hrabeš rovnou na Win32 API ... chlape to je jak kdyby horolezec začínal tím, že by lezl na K2.
Tohle určitě podepíšu - pokud se učíš C++ vykašli se na Win32 API. Je to úplný nesmysl... Pokud se chceš učit programovat GUI pro Windows, na to jsou knihovny a frameworky, které jsou výrazně lepší než Win32 API. I stařičká MFC je mnohem lepší varianta... A pokud máš problém s .h souborem nebo 'case' - jakákoli učebnice C nebo C++ určitě pomůže.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:C++ na Win a chyba poblíž case
« Odpověď #11 kdy: 23. 10. 2013, 07:46:54 »
Kde je ten soubor?

Je vidět v External Dependencies v Solution Exploreru. Je možné, že to VS 2010 zobrazuje jinde nebo že to Expresska nezobrazuje vůbec.

Já jen vyhazuju co nepotřebuju.

To není nejlepší přístup - riskuješ, že Ti tam zbude spoustu mrtvýho kódu, který dokáže akorát tak udělat binec. Spíš lokalizuj co potřebuješ a to vytáhni ven. Co konkrétně potřebuješ?

BTW víš, že je to licencované pod GNU GPL a tím pádem pokud z toho něco zkopíruješ do svého projektu, tak to budeš muset licencovat pod GNU GPL?


webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #12 kdy: 23. 10. 2013, 16:18:28 »
Michal Kovacic:
Jak jsem psal nehodlám vůbec dělat GUI.

eMko:
Vcelku si věřím. V tom aokts.cpp potřebuju akorád spustit funkci FileOpen ... na otevření sccénáře. Viz
Kód: [Vybrat]
scen.open(setts.ScenPath, setts.TempPath)Nechci aby ta aplikace byla vidět, to že běží. Samozřejmě že AOKTS má připravené nějaké chybové hlášky a s těmi musím počítat aby v případě chyby vyskočilo chybové okno.

Není mi úplně jasný proč je tam nastavení cesty přes soubor s nastavení (settings), dejme tomu, že bych přidal ještě jeden argument, který by definoval cestu přímo.

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #13 kdy: 23. 10. 2013, 16:21:53 »
A nevíš jak zjistit kde se ten prs ht.h includuje :-) ? Já ho vidím v Ex. dependencies ale nevím kde se includuje nebo jak to je propojené. Jak tu závislost vytvořit i v mojem projektu.

A díky za informace o tom GNU. To mi nevadí. Rád budu sdílet.

webhope

Re:C++ na Win a chyba poblíž case
« Odpověď #14 kdy: 23. 10. 2013, 17:04:05 »
Tak jsem zjistil, že ten soubor tam mám v těch ext. dep. ale stejně jako by nebyl... Tak ho do aokts.cpp iincluduju manuálně:
#include "c:/program files/microsoft sdks/windows/v7.0a/include/prsht.h"

Mám tam ještě pár chyb vesměs undeclared identifier nebo identifier not found
a to v souvislosti s Tolltips (to ale nepotřebuju, takže mohu odstranit).

A chci se zeptat jestli Sheet_HandleCommand náhodou neobsluhuje Accelerators? Protože příkaz
Kód: [Vybrat]
case ID_FILE_OPEN:
FileOpen(sheet, true, -1);
break;
ID_FILE_OPEN je definován v common.rc jako id menuitem pro otevření souboru...

Čili zde bych potřeboval radu, jak místo tohoto způsobu (switch (id) ... case ... ID_FILE_OPEN) to zprovoznit tak, abych mohl v budoucnu použít volání funkce FileOpen s parametrem cesta k souboru? Momentálně to má fungovat přes menu, které jsem zrušil.