Forum » Programiranje » [C++] Preverjanje ce je program dos ali win32
[C++] Preverjanje ce je program dos ali win32
goranv ::
Zanima me s katerim upazom (c++, windows) preverim ce se program izvaja v dos-u ali v windows-u, da bi potem nek razred vedel na kaksen nacin naj izpise napake. V dos-u npr. z printf(), v windows-u pa MessageBox(). Rad bi da konstruktur razreda sam ugotovi in ne da bi jaz moral vpisati v en parameter v konstrukturju razreda na kaksen nacin se program izvaja.
LP
LP
Vesoljc ::
naceloma se platforma delovanja ugotavlja ob compile time-u ala
#ifdef WIN32 // bla bla #else // bla bla #endif
Abnormal behavior of abnormal brain makes me normal...
'FireSTORM' ::
Ampak to bo potem če se bo kompajlalo izven win32 vsepovsod vzelo drug del.
Torej tudi če se bo kompajlalo na *X sistemu če ni platform specific.
Torej tudi če se bo kompajlalo na *X sistemu če ni platform specific.
Those penguins.... They sure aint normal....
Vesoljc ::
ja seveda, example sem dal...
za vsako platformo rabis svoj define
za vsako platformo rabis svoj define
Abnormal behavior of abnormal brain makes me normal...
BigWhale ::
goranv,
Bi rad, da se program dejansko izvaja v DOSu ali samo v cmd.exe?
Razlika je precej ocitna.
Bi rad, da se program dejansko izvaja v DOSu ali samo v cmd.exe?
Razlika je precej ocitna.
moowy123 ::
Windows nima več pravega DOSa, tko da mislim da tega ne boš mogel preverjati z uporabo ifdef. Če bi pa preverjal za dejanski DOS (recimo ms dos 6.22...) pa bi se dalo preverjati.
BigWhale ::
V bistvu bos moral narediti dva programa.
Vec o tem pa tule.
Ne mores narediti ene aplikacije, ki bi bila hkrati konzole aplikacija in hkrati windows GUI aplikacija.
Vec o tem pa tule.
Ne mores narediti ene aplikacije, ki bi bila hkrati konzole aplikacija in hkrati windows GUI aplikacija.
Person ::
Hm, pa da se ... maš neke APIje, ki odprejo konzolo, pa vanjo pišejo ...
Let's make something useful!
'FireSTORM' ::
BW, maš prav.
Person, ja, skompajlaš C++ program ki v konzoli izpiše Hello World! in izvrši pause command z system call. Ko ga zaženeš se odpre konzola in izpiše Hello World! ter čaka da nekaj stisneš in se zaključi.
Ampak ko pa še dodaš GUI del bo na windowsih se GUI del lepo pojavil v DOSu se bo pa program srušil ali se pa niti zagnal ne bo(Na linux vem da se nebo če nimaš nameščenega X in dejansko zagnanega.)
Person, ja, skompajlaš C++ program ki v konzoli izpiše Hello World! in izvrši pause command z system call. Ko ga zaženeš se odpre konzola in izpiše Hello World! ter čaka da nekaj stisneš in se zaključi.
Ampak ko pa še dodaš GUI del bo na windowsih se GUI del lepo pojavil v DOSu se bo pa program srušil ali se pa niti zagnal ne bo(Na linux vem da se nebo če nimaš nameščenega X in dejansko zagnanega.)
Those penguins.... They sure aint normal....
MrStein ::
Nimaš kaj preverjat.
Če poženeš win program v DOS-u, bo le izpisal "This program requires Windows". Do tvoje kode za "preverbo" ne bo nikoli prišel.
PS: DOS že 10 let "ne obstaja". Zakaj bi se ukvarjal z neobstoječimi zadevami ???
Če poženeš win program v DOS-u, bo le izpisal "This program requires Windows". Do tvoje kode za "preverbo" ne bo nikoli prišel.
PS: DOS že 10 let "ne obstaja". Zakaj bi se ukvarjal z neobstoječimi zadevami ???
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Senitel ::
Ajaj people people...
Če pozabimo DOS iz originalnega posta, kar je že MrStein omenil (It's dead Jim), win32 aplikacije prav nič ne omejuje, da ne bi imela in konzole in okna! Al moram sample pokazat?
Tako da če te znotraj programa zanima ali si v konzoli ali oknu je v bistvu edina pametna rešitev, da pogledaš če ima proces nase pripeto kakšno konzolo.
Če pozabimo DOS iz originalnega posta, kar je že MrStein omenil (It's dead Jim), win32 aplikacije prav nič ne omejuje, da ne bi imela in konzole in okna! Al moram sample pokazat?
Tako da če te znotraj programa zanima ali si v konzoli ali oknu je v bistvu edina pametna rešitev, da pogledaš če ima proces nase pripeto kakšno konzolo.
Person ::
Sej sem že jst mislil sample pokazat :)
Samo mi še zmeri ni jasno, kaj bi sploh avtor teme rad želel ...
No, tisto čudežno zadevco najdete točno tukaj: klikni me nežno
Samo mi še zmeri ni jasno, kaj bi sploh avtor teme rad želel ...
No, tisto čudežno zadevco najdete točno tukaj: klikni me nežno
Let's make something useful!
BigWhale ::
Zakaj je 'bolje' narediti dva programa, kot imeti eno aplikacijo, ki odpre svoj console window je opisano v linku, ki sem ga podal. Tam tudi pise, da to sicer lahko naredis samo bo 'cesko'. :)
BigWhale ::
Hm, da se kar takoj popravim.
Avtor posta, se mi zdi, da je zelel imeti eno aplikacijo, ki bo imela gui in bo tudi konzolna aplikacija.
Se pravi:
lalal.exe /s alal /d fafa
in pa
lalal.exe
Pri cemer se bo v drugem primeru odprl GUI in bos tisi alal in fafa lahko izbral v enem combo boxu, ali nekaj v tem stilu.
To je nerodno za narediti.
PS: firestorm, nekaj taksnega narediti s Qtjem, je pa trivialno. ;>
Avtor posta, se mi zdi, da je zelel imeti eno aplikacijo, ki bo imela gui in bo tudi konzolna aplikacija.
Se pravi:
lalal.exe /s alal /d fafa
in pa
lalal.exe
Pri cemer se bo v drugem primeru odprl GUI in bos tisi alal in fafa lahko izbral v enem combo boxu, ali nekaj v tem stilu.
To je nerodno za narediti.
PS: firestorm, nekaj taksnega narediti s Qtjem, je pa trivialno. ;>
goranv ::
Napisem malo bolj podrobno.
Jaz imam en razred v katerem imam funkcije da se lahko dva racunalnika povezeta med sabo na internetu in med sabo komunicirata. Zdaj ko se ta razred razvijam in ga popravljam, testiram zaenkrat to se v dos-u, zato mi izpise opozorila z printf(), ko bo koncano bom potem to izvajal v win32. Zato ne bi rad vse te opozorila spreminjal iz printf() v MessageBox(), ampak da bo program sam vedel kje se razred izvjaja in bo ustrezno javil napako. Vem da lahko v windows-u v dos-u uporabim messageBox() za opozorila, samo rad bi da se vse izvaja v konzoli.
Zato me zanima, kako bi lahko preveril z #if ali #ifdef ali drugace, da bo ustrezno javil opozorilo.
Jaz imam en razred v katerem imam funkcije da se lahko dva racunalnika povezeta med sabo na internetu in med sabo komunicirata. Zdaj ko se ta razred razvijam in ga popravljam, testiram zaenkrat to se v dos-u, zato mi izpise opozorila z printf(), ko bo koncano bom potem to izvajal v win32. Zato ne bi rad vse te opozorila spreminjal iz printf() v MessageBox(), ampak da bo program sam vedel kje se razred izvjaja in bo ustrezno javil napako. Vem da lahko v windows-u v dos-u uporabim messageBox() za opozorila, samo rad bi da se vse izvaja v konzoli.
Zato me zanima, kako bi lahko preveril z #if ali #ifdef ali drugace, da bo ustrezno javil opozorilo.
MrStein ::
1.) DOS ne obstaja
2.) če uporabiš #if, dobiš dva fajla in nima kaj preverjat. Ti pri prevajanju poveš, kaj bi rad : printf() ali MsgBox()
3.) ko poganjaš iz konzole, uporabi nek parameter, recimo -napake_preko_printf in ga testiraj v programu in ustrezno ukrepaj
2.) če uporabiš #if, dobiš dva fajla in nima kaj preverjat. Ti pri prevajanju poveš, kaj bi rad : printf() ali MsgBox()
3.) ko poganjaš iz konzole, uporabi nek parameter, recimo -napake_preko_printf in ga testiraj v programu in ustrezno ukrepaj
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
BigWhale ::
#ifdef DEBUG printf() #else msgBox() #endif
Ce tole spakiras v en makro, lahko dobis celo tole, recimo:
#define DBG_MESSAGE (_str)\ { #ifdef DEBUG \ printf(_(str)) \ #else \ msgBox(_(str)) \ #endif \ }
in potem uporabis kot:
DBG_MESSAGE("Tralalalala");
Nekje v main() pa naredis nekaj podobnge:
#ifdef DEBUG ... init console ... #else ... init win32 gui ... #endif
In potem v Project Properties ustrezno nastavis preprocesor definition za release in debug verzijo.
Takole nekako priblizno. Ce sem te prav razumel kaj hoces... :)
PS: Zakaj makro in ne funkcija? Makro se hitreje izvede, kot klic funkcije. Ce imas veliko debugginga se to precej pozna.
Zgodovina sprememb…
- spremenil: BigWhale ()
BigWhale ::
V bistvu niti ne bi rabil tko zlo komplicirat, bi lahko naredil samo
#ifdef DEBUG #define DBG_MESSAGE(_str) printf(_(str)) #else #define DBG_MESSAGE(_str) msgBox(_(str)) #endif
Vesoljc ::
> zato mi izpise opozorila z printf(), ko bo koncano bom potem to izvajal v win32
nisem ziher ce dela tudi z printf ampak standard cout stream (stdout, konzola) lahko preusmeris kamor pac hoces (stdout redirection).
nisem ziher ce dela tudi z printf ampak standard cout stream (stdout, konzola) lahko preusmeris kamor pac hoces (stdout redirection).
Abnormal behavior of abnormal brain makes me normal...
SasoS ::
Če bo program windows only, uporabljaj OutputDebugString() namesto printf in msgje spremljaj z debugview.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Visual Studio C++ MessageBox izpis večih spremenljivkOddelek: Programiranje | 1716 (1457) | spinner |
» | [C++] preprosto risanjeOddelek: Programiranje | 1660 (1537) | popec |
» | [c++] prenos po referenciOddelek: Programiranje | 2509 (2444) | atasmrk |
» | [C++]Zagon drugega programa in izvajanje ukazaOddelek: Programiranje | 1429 (1274) | 64202 |
» | [visual c++] #ifdef _DEBUGOddelek: Programiranje | 1095 (1036) | Vesoljc |