Om man startar ett dosfönster/kommandofönster med antingen Shell eller en API, finns det något sätt att kolla vad fönstret skriver ut utan en tempfil? D.v.s utan Shell("Mittprogram > tempfil")?
Jag inbillar mig att man isåf blir tvungen att dra igång ett skal och sen redirecta STDOUT till en pipe som man läser ifrån.
Vad du borde göra är att snoka upp lite kod till tex en Telnet-server. Den gör ju just såna saker som att köra DOS-kommandon läsa av outputen och sen skicka tillbaks denna till en nätverksklient.
Här är lite kod från Windowsversionen av rlogind. Jag kan inte påstå att jag förstår den själv men den kanske ger lite idéer om vilka API:er det handlar om?
Pga att mina C/C++-kunskaper inte är vidare kraftiga skulle det ta något år eller två att först skriva om till VB för att få en bättre överblick och sedan några dagar till för att förstå vad denna kod gör. :) Måste ju finnas något annat.
Har du inte lärt dig programmeringens första regel:
"Allt som verkar lätt är svårt och allt som verkar svårt är lätt."? :OO
Men iaf så lyckades jag snoka upp att Windows Scripting Host verkar ha bättre möjlighet att fånga upp andra processers STDIN och STDOUT än VB själv.
Till exempel så funkar detta rätt bra att köra i VB:
Dim WshShell As Object, oExec As Object, sSTDOUT As String
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("cmd /C dir c:")
Do While True
If Not oExec.StdOut.AtEndOfStream Then
sSTDOUT = sSTDOUT & oExec.StdOut.Read(1)
Else
Exit Do
End If
Loop
Debug.Print sSTDOUT
Hmm .. Kan bara tänka mig att du har en för gammal version av Windows Script Host?
Om du lägger till en referens till Windows Script Host Object Model så ska du kunna köra typat:
Dim WshShell As WshShell, oExec As WshExec, sSTDOUT As String
Set WshShell = New WshShell
Set oExec = WshShell.Exec("cmd /C dir")
Do While True
If Not oExec.StdOut.AtEndOfStream Then
sSTDOUT = sSTDOUT & oExec.StdOut.Read(1)
Else
Exit Do
End If
Loop
debug.Print sSTDOUT
och få upp alla tillgängliga metoder i intellisensen.
Nu fungerar det alldeles utmärkt! Tackar! En fråga till bara, finns det något sätt att få texten att visa ett ä istället för "„" när det egentligen är ett ä och ett å istället för "†" när det egentligen är ett å och alla andra tecken utan att behöva använda replace?
Man kan använda API:et OemToChar för att hantera skillnaderna i Code Pages mellan DOS och Windows:
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Dim WshShell As WshShell, oExec As WshExec, sSTDOUT As String
' osv
[b]OemToChar sSTDOUT, sSTDOUT[/b]
debug.Print sSTDOUT
Motsatsen heter: CharToOem (surprise!)
går det att köra fönstren utan att de syns
Tror, inte det, tyvärr. Då får du nog dyka ner i C-koden däruppe.
Om någon kommer på något annat sätt så man fortfarande kan gömma fönstret så skriv gärna. Håller nämligen på med en webbserver och bygger in stöd för php och vill inte att php.exe ska starta synligt hela tiden.
En reflexion: Om det är en webbserver du skriver så antar jag att du så småningom tänker köra den som en NT-Service? Och om du gör det så kommer problemet att lösa sig själv eftersom services normalt inte "syns" när de exekverar.
En annan tanke: Bara för att det körs som en service så betyder det inte att andra program som startas av servicen också är dolda. :)
r/ Kom just på att det kanske går om man på något sätt kan starta ett annat program inuti sitt eget som en ny thread (tråd? :q). Eller om man kan använda sig av php4ts.dll som används av både webbservermoduler och php.exe. :) Dags att börja studera om det går. Hittar du något bra så tipsa gärna!
Hittade en kod som fungerar utmärkt och gömmer fönstret även om man inte har programmet som en service. :i Bifogar klassmodulen till detta.
r/ Bifogar som zip istället i nästa meddelande då man inte får ladda upp en ny fil vid redigering och fler personer antagligen kan öppna zip snarare än rar. :r