Spustitelný výstupní soubor – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spustitelný výstupní soubor – C / C++ – Fórum – Programujte.comSpustitelný výstupní soubor – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
RoboHK0
Newbie
4. 7. 2017   #1
-
0
-

Chtěl bych touto cestou poprosit o pomoc. Mám ve W10 Pro x64 svůj program v C++ (C::B, wxWidgets + Firebird embedded 2.5.2), který vyprodukuje výstupní soubor. Asociace souboru s programem nefunguje. Bohužel jsem nikde nenašel popis toho, co mi kde chybí. Jestli nějaký CreateProcess, nebo Shellexecute nebo něco jiného - natož co by to mělo obsahovat a kam to vrazit (program | soubor | Inno setup | jinam... ). Jedná se o nějaký *.bat spuštěný při poklepání na ikonu souboru nebo něco jiného? Stačilo by mě nasměrovat na nějakou vhodnou stránku, kde bych se dozvěděl víc a hlavně jak na to. Nebo alespoň objasnit základní princip. Teď - poklepání na ikonu souboru se objeví okno:

Unexpected parameter 'D:\AE.FBM'                // (můj výstupní soubor)

a následně se objeví další okno:

Usage: Rozpočet 2.0[/h][--verbose]                // (můj program)

/h, --help           show this help message

--verbose          generate verbose log message

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
5. 7. 2017   #2
-
0
-

CreateProcess a ShellExecute spouští jiné programy, s tímhle to nemá co dělat. Při poklepání se nespouští žádný baťák, v tom setupu přece definuješ jako open\command ten tvůj program s parametrem "%1", který se nahradí cestou k tomu souboru.

Ve vxWidgets jsou podle dokumentace parametry programu ve wxApp::argc (počet) a wxApp::argv (data), ale ještě je tam parser parametrů, který ti háže tu chybu. Podle příkladů by řešení vypadalo nějak takhle:

void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
{
    wxApp::OnInitCmdLine(parser);

    parser.AddParam("document-file",
                    wxCMD_LINE_VAL_STRING,
                    wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL);
}

bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
{
    for ( size_t i = 0; i != parser.GetParamCount(); ++i )
        m_filesFromCmdLine.push_back(parser.GetParam(i));

    return wxApp::OnCmdLineParsed(parser);
}
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
5. 7. 2017   #3
-
0
-

Ještě jsem koukal, že v tom setupu máš namíchaný .fbmr a .fmbr. To .fbm ti asi funguje jen náhodou jako pozůstatek nějakých pokusů.

Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
5. 7. 2017   #4
-
0
-

#3 gna
Díky moc, ihned jdu laborovat. A k fbm / fbmr: ANO, když mi nefungovala jedna přípona, zkoušel jsem jinou a když jsem opisoval text z výstřižku (po změně přípony jsem nový nedělal), tak jsem opsal ten starý. V Inno mám příponu dobře, shoduje se s programem. Zrušil jsem starou příponu i v registrech přes cmd, takže tam je snad už pořádek. Mimochodem: kde jsi se prosím tě dočetl o té funkci, kterou si mi doporučil? Já mám knihu od J. Smarta (a nenašel, asi jsem nevěděl pod čím hledat). Potíž je taky v tom, že když hledám pomoc pro "samo-spustitelný soubor", tak je cca 99,99% pro výstup z kompilátoru (exe), což je dle mě už program (snad kromě hello world)... Ještě jednou dík a jdu na to. Dám vědět.

Nahlásit jako SPAM
IP: 89.176.206.–
RoboHK0
Newbie
5. 7. 2017   #5
-
0
-

Tak jsem to vyzkoušel a spuštění funguje. Ještě jednou dík. Nenačte ale interní ikony programu (New, Open, Save ....) a vyhazuje to jako chybu. Když chybu ingnoruju, program se spustí, ovšem bez ikon. Řádek v Inno vypadá následovně:

Root: HKCR; Subkey: "{#MyAppName}\DefaultIcon"; ValueType: string;  ValueName: "";  ValueData: "{app}\{#MyAppExeName},0"; 

Moje ikony jsou v samostatné složce Rozpočet\icons - ve formátu png. Má se upravit tento řádek, nebo se má definovat nový? Moc prosím o názor, popř. nakopnutí správným směrem. Studoval jsem na inno wiki příklad Lazarus, je tam toho opravdu hodně, ale interní ikony programu jsem nevystopoval. Ještě mě napadlo, že já do Files -  Source dávám celý adresář jako jeden blok, jestli to nechce vložit složku po složce samostatně. Nějaký nápad?

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
5. 7. 2017   #6
-
0
-

To je zase jen klíč v registrech, který Průzkumníkovi definuje ikonu toho souboru. Na funkci programu to nemá vliv.

Při spouštění dvojklikem je pracovní složka programu tam, odkud jsi ho spustil (kde je ten soubor, ne exáč). Takže tipuju, že problém bude v tom, že používáš relativní cesty k těm ikonám. Můžeš změnit pracovní složku, nebo používat absolutní cesty.

wxSetWorkingDirectory(...)
wxStandardPaths::Get().GetResourcesDir() + ...
Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
5. 7. 2017   #7
-
0
-

#6 gna
Díky moc. Budu muset nastudovat, nevím kam to vložit a v jakém formátu. Já mám v konstruktoru ikony ve formátu:

wxImage::AddHandler(new wxPNGHandler);
wxImage new(wxT("icons/document-new-5.png"), wxBITMAP_TYPE_PNG);
...
...

Takže dík a jdu surfovat a googlit.

Nahlásit jako SPAM
IP: 89.176.206.–
RoboHK0
Newbie
5. 7. 2017   #8
-
0
-

#7 RoboHK
To new je newDB

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
5. 7. 2017   #9
-
0
-

   

wxString icons = wxStandardPaths::Get().GetResourcesDir() + wxT("/icons/");
wxImage newDB(icons + wxT("document-new-5.png"), wxBITMAP_TYPE_PNG);
Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
6. 7. 2017   #10
-
0
-

#9 gna
Díky moc, ale nefunguje. Zkoušel jsem i tvar"

wxImage newDB(wxStandardPaths::Get().GetResourcesDir() + wxT("\\icons\\document-new-5.png"), wxBITMAP_TYPE_PNG);

co mi poradil hodný člověk na fóru. Já mám ten handler ve zdrojáku cpp - v konstruktoru MyFrame:

wxImage::AddHandler(new wxPNGHandler);
wxImage new(wxT("icons/document-new-5.png"), wxBITMAP_TYPE_PNG);
...

 
Hlavičku <wx/stdpaths.h> mám pro jistotu v obou (h i cpp), tak fakt nevím. Po přepsání nefunguje ani hlavní program (spouštěný z IDE C::B 16.01 + wx 3.0.2 na W10). Chybové hlášky vypadají následovně:

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 89.176.206.–
RoboHK0
Newbie
6. 7. 2017   #11
-
0
-

#10 RoboHK
Mám dojem, že program zatím nedokáže pracovat s příkazem:

wxStandardPaths::Get().GetResourcesDir()...

Zkoumal jsem příčinu chyby v src/msw/bitmap.cpp (řádek 922), jedná se o špatný převod wxDIB.
Ale když vrátím původní tvar výrazu, převod je OK a ikony se zobrazí. Tak si myslím, že se k 
převodu žádná ikona nedostane a proto vyhodí chybu.

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
6. 7. 2017   #12
-
0
-

Ta funkce vrací složku, ve které je exáč. Jestli to potřebuješ jinak, tak si to uprav.

V těch chybových hlášeních vidíš, jakou cestu to generuje.

Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
6. 7. 2017   #13
-
0
-

#12 gna
Díííík, funguje to. Stačilo přesunout složku icons do složky bin. Ještě jednou děkuju za pomoc. 

Nahlásit jako SPAM
IP: 89.176.206.–
RoboHK0
Newbie
8. 7. 2017   #14
-
0
-

Vše funguje skvěle, jenom když poklepáním na ikonu výstupního souboru spustím program, otevře se prázdný soubor (čistý program, bez uložených hodnot). Myslím, že to zařídí řetězec "document-file" z #2. příspěvku. Dle parser.Addparam(...) se jedná o 'const wxString & desc'.

Když jsem googlil, objevil jsem příklad, který (asi) platí pouze o vstup z konzole:

static const wxCmdLineEntryDesc cmdLineDesc[] =
{
    { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" },
    { wxCMD_LINE_SWITCH, "q", "quiet",   "be quiet" },
    { wxCMD_LINE_OPTION, "o", "output",  "output file" },
    { wxCMD_LINE_OPTION, "i", "input",   "input dir" },
    { wxCMD_LINE_OPTION, "s", "size",    "output block size", wxCMD_LINE_VAL_NUMBER },
    { wxCMD_LINE_OPTION, "d", "date",    "output file date", wxCMD_LINE_VAL_DATE },
    { wxCMD_LINE_PARAM,  NULL, NULL, "input file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
    { wxCMD_LINE_NONE }
};
wxCmdLineParser parser;
parser.SetDesc(cmdLineDesc);

Toto se patrně vkládá do hlavičkového souboru. Ale co s tím dál, nebo je to vše úplně jinak? Prosím o pomoc.

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
8. 7. 2017   #15
-
0
-

Windows jen spustí program s požadovanými parametry. Ve tvém případě dostaneš parametr s cestou k souboru. Nic víc. Je na programu, jak s parametry naloží.

wxApp ve wxWidgets parametry automaticky parsuje. V OnInitCmdLine se parametry definují a po úspěšném rozparsování se zavolá OnCmdLineParsed. (Nebo se při chybě v OnCmdLineError vypíše to "usage..." a program skončí)

Ten můj příklad v OnInitCmdLine přidá nepovinný vícenásobný textový parametr (na tom názvu "document-file" nezáleží), takže o něm parser ví a nezařve a v OnCmdLineParsed se ten parametr uloží do vektoru m_filesFromCmdLine.

Pak někde dále v programu si ten vektor projdi a soubor(-y) otevři, jak potřebuješ.

Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
8. 7. 2017   #16
-
0
-

Dík, já myslel nahradit jej něčím velice zhruba podobným jako:

wxString commandLineArgs = wxTheApp->argv[0];

 parser.AddParam(commandLineArgs,....

Ale to je jenom nástřel, myslel jsem že argv[0] je název aktuálně spuštěného souboru. Ale nevím to jistě.

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
8. 7. 2017   #17
-
0
-

Ten soubor se nespouští. Spouští se program. V argv[0] je cesta k programu. Na dalších indexech jsou další parametry, jako třeba cesta k souboru, kterou jsi v open\command definoval, že tam chceš předat.

Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK0
Newbie
8. 7. 2017   #18
-
0
-

Aha, tak tudy asi ne. Já jako první věc spouštím prázdný program. Až pak vytvářím Nový soubor, pak ukládám etc... Jde mi  o to, že když poklepu na ikonu výstupního souboru (např. A1.fbmr), spustí se prázdný program (bez vyplněných tabulek, co jsou již uloženy v tom A1.fbmr). A já teď přemýšlím jak získat ten název souboru a jak jej načíst. Kam to zapsat, jestli nějak už do bool MyApp::OnInit() nebo kam. 

Nahlásit jako SPAM
IP: 89.176.206.–
RoboHK0
Newbie
8. 7. 2017   #19
-
0
-

Po doplnění do OnInit: 

wxString appname = BaseApp::GetAppName();
wxLogMessage (wxT("%s"), appname);

a všem to vypíše 'Rozpočet' místo 'A1-fbmr'. Což je hlavní program. Kde se prosím dopátrám toho názvu souboru, na který jsem poklepal myší a tím spustil program?

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
8. 7. 2017   #20
-
0
-

A jako čekáš, že se ti to nějak udělá samo? Čtyři dny ti píšu, že ta asociace souboru je příkaz, který spustí ten tvůj program s parametrem určujícím soubor, přes který jsi ho spustil.

Ten můj příklad v OnInitCmdLine přidá nepovinný vícenásobný textový parametr (na tom názvu "document-file" nezáleží), takže o něm parser ví a nezařve a v OnCmdLineParsed se ten parametr uloží do vektoru m_filesFromCmdLine.

Pak někde dále v programu si ten vektor projdi a soubor(-y) otevři, jak potřebuješ.

Takže někde, kde už máš všechno inicializované (jo, možná na konci wxApp::OnInit) vem ten název souboru a když ho umíš uložit, tak ho musíš umět i načíst.

Nahlásit jako SPAM
IP: 213.211.51.–
RoboHK
~ Anonymní uživatel
22 příspěvků
8. 7. 2017   #21
-
0
-

#20 gna
Omlouvám se, nebylo mi totiž jasné na kterém místě se to dá udělat. 

Nahlásit jako SPAM
IP: 89.176.206.–
ondra.holub+1
Stálý člen
8. 7. 2017   #22
-
0
-

#17 gna

Jen pro úplnost:
> V argv[0] je cesta k programu.

Ve Windows to tak možná je. Ale obecně to rozhodně neplatí. V Unixu je v argv[0] cokoliv, co tam rodičovský proces strčil. Přenositelný způsob, jak zjistit cestu k běžícímu programu, v C++ není. Buď se musí využít nějaká multiplatformní knihovna, nebo různý kód v #ifdef ... #else ... #endif (např. v Linuxu je to v linku /proc/self/exe).

Nahlásit jako SPAM
IP: 185.162.26.–
gna
~ Anonymní uživatel
1891 příspěvků
8. 7. 2017   #23
-
0
-

#22 ondra.holub
Ve Windows tam taky může být cokoliv, ale to je tady úplně jedno.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 103 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý