Tervehdys, VB6:lla pitäisi saada tehtyä vanhaan kunnon MSDOS-tyyliin toimiva, sinällään erittäin yksinkertainen komento year(.exe), joka pulauttaa lopputuloksensa suoraan konsolin komentoriville (stdOut)seuraavasti:
C:\>year
2007
C:\>
Mitenkäs tämä temppu oikein tehdään fiksusti VB6:lla, josta ei perskules löydy vaihtoehtoa, jossa luodaan suoraan konsolisovellus (kuten vb.net:istä löytyy) ? Osaan kyllä kirjoittaa tuon vuosiluvun kaikkialle muualle, mutta en tähän konsolin komentoriville. Myös argumenttien välitys (stdIn) pääohjelmalle sujuu..
Pääsin kyllä ongelman ratkaisun jäljille => netistä penkomalla löytyi vinkkejä, joiden avulla pystyy tekemään konsolisovelluksia käyttämällä hyväksi minulle vielä hyvin vierasta Win32 API rajapintaa, mutta näissä esimerkeissä avataan ohjelman suoritusta varten oma konsoli-ikkunansa, mikä ei mun tapauksessa ole toivottavaa. Linkki, jonka avulla sain homman melkein toimimaan oli:
http://visualbasic.about.com/od/learnvb6/l/
Eikö tuon voi toteuttaa ihan battina? Vai on ko dos-prompti niinkin paska että tuollaista ei saa aikaiseksi ?
Enpä keksinyt heti kuinka ton voisi tehdä.. DOS komennolla date /T saat tulokseksi päivämäärän ja vuoden, mutta siitä pitäs saada siivottua päivämäärä ja rivinvaihto vielä pois.. Itseasiassa toi year-komento on mulla tulossa osaksi erästä toista battia, jonka hakemistopolun osana vuosiluku on, siksi date /T -komento ei sellaisenaan toimi..
.. harvinaisen hankalaksi menee näinkin yksinkertaisen asian teko.. ;)
Googlella tai jopa täältä ohjelmointiputkasta löytynee APIt tähän hätään. VB-ajoista on ikävä kyllä jo niin pitkään, etten enää muista tekikö se uuden ikkunan vai osasiko hienosti tulostaa jo olemassaolevaan komentoriviin.
Tsekkaas tämä:
http://en.allexperts.com/q/Visual-Basic-1048/return-value-VB-EXE.htm
lainaus:
As far as getting the argument back, that's going to be a little different. I'm sure there is some obscure way of doing this, but I think I would simply write the information somewhere and read it after your call. You could even pass a result file name as another command line argument and have the application write the results to the given file name. You can then pick that file up and get your results.
Tässäkin saatta olla jotain:
http://www.xaprb.com/blog/2005/10/14/how-to-create-a-vb6-console-program/
Quirzo, kiitoksia linkeistä, mutta noissa kumpaisessakin neuvotaan, kuinka komentorivin argumentteja voidaan lukea ohjelmaan.. Toiseen suuntaan tapahtuvaan merkkijonon siirtoon suoraan komentoriville noistakaan ei ole apua.. Ehdottelevat ko. datan tuuppaamista johonkin sopivaan tiedostoon ja sen sieltä edelleen käyttöä.. Noin se on mulla nimenomaan tällä hetkellä tehty ja siitä pyrin pääsemään eroon...
Tuolla on toimiva moduuli, jonka avulla voi tehdä konsoliohjelman:
http://vb.mvps.org/samples/project.asp?id=Console
Tarvittava koodi on silloin näin lyhyt:
Sub Main()
Con.Initialize
Con.WriteLine Year(Now)
End SubMutta kuten sivulla mainitaan:
Karl E. Peterson's Classic VB Code kirjoitti:
The only difference between a console application and a windowed application, is a single bit in the Portable Executable (PE) file header which is set during the compilation process. Classic VB doesn't natively support setting this PE attribute.
Ratkaisu on tiedostossa:
http://www.mvps.org/st-software/Code/all.zip
Tuon paketin ohjelmalla MkConsole.exe ohjelman pystyy muuttamaan aidoksi konsoliohjelmaksi.
Antti:
Erittäin paljon kiitoksia, lähti lyyti kirjoittamaan noilla ohjeilla.. Ei olisi meikäläisen tiedoilla ihan heti ratkennut tämä ongelma..
Aihe on jo aika vanha, joten et voi enää vastata siihen.