» »

[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

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.
Those penguins.... They sure aint normal....

Vesoljc ::

ja seveda, example sem dal...
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.

goranv ::

v windows-u v dosu ne ob zagonu racunalnika ce to mislis.

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.

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.)
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 ???
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Ajaj people people... >:D

Č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 ;)
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. ;>

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.

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
Motiti se je človeško.
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).
Abnormal behavior of abnormal brain makes me normal...

SasoS ::

Če bo program windows only, uporabljaj OutputDebugString() namesto printf in msgje spremljaj z debugview.

BigWhale ::

Joj tale debug view je tolk nerodn... :/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Visual Studio C++ MessageBox izpis večih spremenljivk

Oddelek: Programiranje
181695 (1436) spinner
»

[C++] preprosto risanje

Oddelek: Programiranje
71648 (1525) popec
»

[c++] prenos po referenci

Oddelek: Programiranje
92486 (2421) atasmrk
»

[C++]Zagon drugega programa in izvajanje ukaza

Oddelek: Programiranje
111409 (1254) 64202
»

[visual c++] #ifdef _DEBUG

Oddelek: Programiranje
51081 (1022) Vesoljc

Več podobnih tem