Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi, ako zmenit vystupnu premennu?

Chcem si urobit jednoduchy program ktory spusti iny program a zachyti jeho vystup. Nasiel som si tento priklad http://zive.cz/h/Programovani/AR.asp?ARI=112035&CAI =2091 kde je to urobene tak ze sa to najskor zapise do suboru z neho do Memo a potom sa ten subor zmaze. Neviem to ale prerobit tak aby to zapisalo priamo do premennej napr. vystup:string. Poprosil by som niekoho kto tomu rozumie aby mi napisla ako to zmenit.

Předmět Autor Datum
mě jen není jasné, jak jinak než zachycením výstupu jiné aplikace do souboru (ergo přes OS) bys chtě…
touchwood 27.05.2006 22:33
touchwood
Ja v podstate proti suboru ani nic nemam len tato operacia sa bude vykonavat v cikle a nechcel som n…
Andrej 27.05.2006 23:26
Andrej
Nasiel som ze existuje v Delphi TMemIniFile ktory vsetky udaje uklada do vyrovnavacej pamate. //Tak…
Andrej 28.05.2006 01:32
Andrej
Nechapu, ceho chces dosahnout. K cemu potrebujes THandle pri praci s TMemIniFile ? Otevreni souboru…
Jan Fiala 28.05.2006 07:08
Jan Fiala
Kedze to bez suboru nejde tak som ho chcel nahradit niecim co nieje umiestnene na disku (proces sa b…
Andrej 28.05.2006 10:00
Andrej
Ak mas zdrojaky / robis oba programy, tak si nieco precitaj (napr. na msdn.microsoft.com) o komunika…
MM.. 28.05.2006 10:36
MM..
on se ale odkazoval na "jednoduché" DOSovské aplikace
touchwood 28.05.2006 11:30
touchwood
Program ktory chcem spustat je uz urobeny (nieje to program ktory som vytvoril ani k nemu nemam zdro…
Andrej 28.05.2006 12:51
Andrej
A uvedomuješ si, že píšeš protichodné veci? Ako chceš upraviť aplikáciu, ktorá je už vytvorená a nem…
msx. 28.05.2006 13:49
msx.
Este raz: 1) Je externy program ktory potrebujem spustit s urcitym parametrom ktory sa bude menit. 2…
Andrej 28.05.2006 16:14
Andrej
Áno už rozumiem, ale na druhej strane, disková vyrovnávacia pamäť pre takéto účely nie je až tak mal…
msx. 29.05.2006 08:39
msx.
Ve WinXP je nějaký standardní ramdisk? To mi uniklo, můžeš mi k tomu dát bližší info? Díky. Pavel
Pavel 28.05.2006 12:39
Pavel
Ovládací panely -> Pridat hardware -> Dalsi -> Ano hardware jiz byl pridan -> Dalsi -> Na konci zozn…
Andrej 28.05.2006 13:36
Andrej
Díky moc. Mám WinXP SP2 a po nainstalování (dokončení Průvodce přidáním HW) se dozvím: "Toto zařízen…
Pavel 28.05.2006 13:46
Pavel
Ovládací panely -> Pridat hardware -> Dalsi -> Ano hardware jiz byl pridan -> Dalsi -> Na konci zozn…
msx. 28.05.2006 13:58
msx.
Teraz som to skusal a po tom co som napisal vyssie si windows vypital instalacne CD a nainstaloval z…
Andrej 28.05.2006 15:59
Andrej
Já sám používám jinej ramdisk, myslím že od cenateku, free verzi. Smysl rozhodně má: mám na něm doča…
Pavel 28.05.2006 16:57
Pavel
Ja som to tiez povodne nasiel v suvislosti s Temporary internet files v IE. Myslim ze to so SP2 neja…
Andrej 28.05.2006 17:30
Andrej
Skús sa pozrieť sem, či je to, čo chceš: truco.cgi P.S. Ja som to skúsil s mojou konzolovou apliká…
pme 28.05.2006 18:51
pme
Tohle je ale odchytavany vystupu konzolove aplikace. Pokud to ta aplikace zapisuje do souboru, ktery…
Jan Fiala 28.05.2006 20:30
Jan Fiala
Chcem si urobit jednoduchy program ktory spusti iny program a zachyti jeho vystup. Hlavne o to išl… poslední
pme 29.05.2006 18:19
pme
Vdaka za odkaz :-);-). Funguje to tak ako som povodne chcel prerobit ten odkaz na zaciatku. Nezapisu…
Andrej 29.05.2006 00:12
Andrej
Klobúk dole.::)
msx. 29.05.2006 08:48
msx.

mě jen není jasné, jak jinak než zachycením výstupu jiné aplikace do souboru (ergo přes OS) bys chtěl docílit "přečtení" tohoto výstupu. Snad jen si napsat vlastní emulátor :-) Logicky přece musíš nechat systém aplikaci spustit, nechat proběhnout a její výstup přesměrovat do souboru nebo pipky. Bohužel pipky jsou v DOS/Win implementovány hrozně, takže ti nic jiného, než "sprostý soubor" :-D nezbývá.

Pokud jsem to nepochopil, tak sorry :-D

Nasiel som ze existuje v Delphi TMemIniFile ktory vsetky udaje uklada do vyrovnavacej pamate.

//Takze by som potreboval zmenit
var tmp: THandle;
tmp := CreateFile(PChar('Test.tmp'), Generic_Write, File_Share_Write,
@tmpSec, Create_Always, File_Attribute_Normal, 0);
//na 
var tmp:TMemIniFile;
tmp:= TMemIniFile.Create('vystup.ini');
// tak aby toto priradenie fungovalo
 start.hStdOutput := tmp;
 

Takze otazka znie ako z TMemIniFile urobit THandle aby to ukazovalo na subor 'vystup.ini'?

Kedze to bez suboru nejde tak som ho chcel nahradit niecim co nieje umiestnene na disku (proces sa bude vykonavat v cykle aby sa stale nevytvaral a nemazal na disku). Nakoniec to asi vyriesim pomocou RamDisku co je standardne v XP. Tam nepotrebujem nic menit a mozem k tomu pristupovat ako k disku a fyzicky to bude umiestnene v RAM.

Ak mas zdrojaky / robis oba programy, tak si nieco precitaj (napr. na msdn.microsoft.com) o komunikacii a prenose dat medzi procesmi/aplikaciami. Je to obsirna tema, riesit to cez subory je samozrejme najjednoduchsie ale (ako prave vidis) najchujovejsie riesenie.
To nemozes urobit len ako jednu aplikaciu?

Program ktory chcem spustat je uz urobeny (nieje to program ktory som vytvoril ani k nemu nemam zdrojove subory). Povodne som nevedel preco je v tom priklade pouzity subor ako medziclanok na prenos informacii a myslel som ze nahradenie za iny typ premennej nebude problem. Kedze to problem :-| je tak to budem riesit tym RamDiskom na ktorom budem pracovat. Hlavne my slo o disk aby sa nan neustale nevytvaral a nemazal subor ktory sluzi k prenosu udajov z externej aplikacie do mojho programu. Oznacil by som to za vyriesene. Pokial pozna niekto efektivnejsi sposob ktory nieje prilis narocny tak budem rad ak ho tu spomenie.

A uvedomuješ si, že píšeš protichodné veci? Ako chceš upraviť aplikáciu, ktorá je už vytvorená a nemáš k nej zdrojový kód, tak aby výstup neukladala na disk, ale do pamäti? Viem, že už si sa zmieril so súborom, ale doteraz si chcel súbor niečím nahradiť. Môžeš mi prosím vysvetliť, ako si si to predstavoval?

Este raz:
1) Je externy program ktory potrebujem spustit s urcitym parametrom ktory sa bude menit.
2) Ten odkaz na zaciatku ukazuje riesenie ako to realizovat v Delphi.
3) Externy program sa spusti a jeho vystup sa ulozi do suboru ktory sa na tento ucel vytvori. Z neho sa informacie nacitaju do Memo a subor sa zmaze.
4) Povodne som chcel aby sa informacie miesto do suboru ukladali do premennej typu string (cize do pamate nie do suboru fyzicky sa nachadzajucom na disku).
5) Teraz uz viem ze to take jednoduche nieje a tomu suboru sa asi nevyhnem takze som sa rozhodol to realizovat tak ako je to v tom priklade len s tym rozdielo ze ten subor bude umiestneny na RamDisku cize v pamati. Je to 'oklukou' ale zatial je to asi najlepsie riesenie ako tuto operaciu vykonavat v pamati a nie na disku.
Cele to vlastne bolo o tom ako zrychlit tento proces a aby som nepracoval s diskom ale s RAM. Dufam ze som to dostatocne objasnil.

Áno už rozumiem, ale na druhej strane, disková vyrovnávacia pamäť pre takéto účely nie je až tak malá, takže si myslím, že nie je nutné pracovať kvôli tomu práve s RAM diskom. Alebo to máš pravdepodobne asi odskúšané a nie si s tým spokojný, pretože ten disk ozaj veľmi šramoce? Zrejem to tak bude. Ale aký dlhý je teda ten výstupný súbor? Počítam, že rádovo megabyty, je tak?

Ovládací panely -> Pridat hardware -> Dalsi -> Ano hardware jiz byl pridan -> Dalsi -> Na konci zoznamu Pridat nove hardwarove zarizeni ->Dalsi -> Nainstalovat hardware ktery vyberu ze seznamu -> Na zaciatku zoznamu Zobrazit vsechna zarizeni -> Dalsi -> Vlavo Vyrobce vybrat Microsoft v pravo model Windows Ram Disk Controller.

Ovládací panely -> Pridat hardware -> Dalsi -> Ano hardware jiz byl pridan -> Dalsi -> Na konci zoznamu Pridat nove hardwarove zarizeni ->Dalsi -> Nainstalovat hardware ktery vyberu ze seznamu -> Na zaciatku zoznamu Zobrazit vsechna zarizeni

Tak a v tejto chvíli mi to zmrzlo, po čase naskočilo v titulku "neodpovídá". Do pekla aj s Windowsom. Bill mi lezie krkom. V TaskBare to nemám, čiže TaskManager to ani nezobrazuje. Ak to chcem ukončiť, musím seknúť nejaký proces. A teraz otázka: Aký? Billa za vajcia do prievanu na hrdzavý hák.3-[

Edit: Ako som hľadal proces, ktorý ukončiť, tak na mňa vyskočilo to okno (asi po 10 minútach). Ach, zaujímalo by ma, keď má WinXP taký problém s okamžitou reakciou, tak, čo bude robiť Windows 6.0.[icon_rolleyes.gif]

Teraz som to skusal a po tom co som napisal vyssie si windows vypital instalacne CD a nainstaloval z neho ovladac na ten RamDisk. Nenastala ziadna chyba. Mam taky dojem ze treba este nainstalovat i Zarizeni Windows RAM Disk (svazek) to je tam kde bol i ten Windows Ram Disk Controller. Ked som urobil i toto tak este stale sa mi neobjavil novy disk. Ja som sa s tymto zaoberal asi pred rokom a urcite to fungovalo v XP SP1. Este po tom popatram na internete pretoze nemozem najst ten postup pomocou ktoreho som to robil prvi krat. Neviem preco to u vas dvoch skoncilo chybami. Mozno to ma vazbu na nejaku sluzbu ktoru mate vypnutu. I ked i ja mam niektore povipinane. Najvacsia nevyhoda tohto RamDisku je ze ma iba 32MB a myslim ze sa uz neda zvacsit. Posudte sami ci vam to k niecomu bude. Pokusim sa najs presny postup ako to spojazdnit.

Ja som to tiez povodne nasiel v suvislosti s Temporary internet files v IE. Myslim ze to so SP2 nejako zmrsili aj ked stale nemozem najst ten navod podla ktoreho som to robil pred rokom. Nasiel som odkaz pre Win2k support.microsoft.com ked som ten ovladac nainstaloval miesto toho co sa nainstaloval z instalacneho CD k windowsu XP SP2 tak sa mi ten RamDisk objavil ako disk ale s kapacitou 0B a nieje pristupny. Nechce sa mi uz s tym hrat nainstalujem si tiez nejaku free verziu RamDisku. Z istotou mozem povedat ze v XP SP1 to fungovalo. Dalsi odkaz na tuto temu 7963

Zpět do poradny Odpovědět na původní otázku Nahoru