Vraag & Antwoord

Programmeren

Errorlevels en VB,,, HOE?

13 antwoorden
  • hallo allemaal! ik zit met een kleine vraagje. ik zal eerst uitleggen waar deze vandaan komt, daar jullie er beter en adequater op kunnen reageren.:D ik probeer een programma te maken die over het netwerk berichtjes kan verzenden. hij maakt gebuik van de service 'Messenger' en wel als volgt: Door de computernaam vd ontvanger en het bericht aan de gebruiker vragen en dan de opdracht [color=red:c00513d537]'net send'[/color:c00513d537] te batchen met die parameters. dit programma opent dus een opdrachtprompt daarvoor. Dit allemaal is misschien nogal omslachtig:D maja dat moet dan maar even... nu lukt dat batchen wel, maar ik wil graag de errorlevels die 'net send' achterlaat weer terugzien te krijgen in dat programma (vb), zodat ik ook nog eens aan de gebuiker kan laten weten of het bericht is verzonden of niet en wat dan fout is gegaan. [size=18:c00513d537][color=brown:c00513d537]en nu de vraag:[/color:c00513d537][/size:c00513d537] [size=24:c00513d537][color=green:c00513d537]hoe moet dat?[/color:c00513d537][/size:c00513d537] als ik heel erg onduidelijk ben zeg het dan meteen maar (ik heb nogal een reputatie namelijk :lol: ) ik hoop snel iets te horen -- sven[size=18:c00513d537][/size:c00513d537]
  • Het batch-proces pipen of dat in vb kan weet ik niet zo eentweedrie Misschien kan je het batch bestandje zo aanroepen: [i:37578d8a70]batch.bat > c:\test.txt[/i:37578d8a70] en dan periodiek proberen om c:\test.txt uit te lezen. Vervolgens kan je hieruit de error-codes wel parsen neem ik aan.
  • hee bedankt man, ik zat al te denken het moest op die manier, alleen wist niet hoe het moest. Nu heb ik heb de errorlevel in een bestand en kan die zo met vb openen. YESS ok bedankt man later!
  • btw wat is dat pipen waar jij over spreekt?
  • CreatePipe() API. Hiermee kun je de output van het ene programma "doorsturen" naar het andere. De output komt dus niet op het scherm, maar wordt naar bv. jouw programma "gestuurd". Ook input kun je zo pipen. door achter een console-command [i:347c850418]> file [/i:347c850418] te tikken, pipe je als het ware de output van deze opdracht naar een bestand.
  • Je zou ook "ShellExecute" kunnen gebruiken, zoiets als dit bijvoorbeeld: [code:1:6cc6790e8b] Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Result = ShellExecute Me.hwnd, vbNullString, "net", "send computernaam tekstbericht", "C:\", 0 [/code:1:6cc6790e8b]
  • wow :o ja sorry hehe, ik ben nog niet zo gevorderd, ik snap er eerlijk gezegd niet zo veel van, maar dat wou ik nu ff niet bespreken, want er is een nieuw probleempje bijgekomen. hier is de code waarmee ik de boel batch: [code:1:8a642decf5]Public Sub ToComp(CompName As String, CompMessage As String) ClearDir MkDir "C:\TBBBG" Open "C:\TBBBG\FirstBatch.bat" For Output As #1 Print #1, "net send " & Trim(CompName) & " " & Chr$(34) & CompMessage & Chr$(34) Print #1, "echo %errorlevel%" Close #1 Shell "C:\TBBBG\FirstBatch.bat > Report.txt" Do Until bFileExists("C:\TBBBG\Report.txt") = True n = n + 1 If n = 10 Then Exit Do Loop Open "C:\TBBBG\Report.txt" For Input As #3 Line Input #3, sReport Line Input #3, sReport Line Input #3, sReport Close #3 nErrorLev = Val(sReport) MsgBox Str(nErrorLev) End Sub Public Function bFileExists(sFileName As String) As Boolean If Dir$(sFileName) <> "" Then bFileExists = True Else bFileExists = False End Function Public Sub ClearDir() If bFileExists("C:\TBBBG\FirstBatch.bat") Then Kill "C:\TBBBG\FirstBatch.bat" If bFileExists("C:\TBBBG\Report.txt") Then Kill "C:\TBBBG\Report.txt" If Dir$("C:\TBBBG", vbDirectory) = "TBBBG" Then RmDir "C:\TBBBG" End Sub[/code:1:8a642decf5] hij blijft maar in die loop zitten als ik die n=n+1 er niet in zet. waarom doet ie dat, want dat betekent dat de batch zijn ouput nog niet in Report.txt heeft gezet, omdat die blijkbaar nog niet bestaat. Maar de batch moet al klaar zijn met alles omdat VB de 'shell' opdracht al heeft afgerond. De opdracht shell wacht toch totdat het programma helemaal klaar is?
  • Op de manier in jouw code wordt Report.txt aangemaakt in de directory van waaruit je je VB programma opstart. Staat je VB programma zelf ook in de C:\TBBBG directory of staat de VB exe in een andere folder?
  • Maar is het niet makkelijker om rechtstreeks het net commando uit te voeren i.p.v. via een batch file? Zoals dit bijvoorbeeld: Shell "C:\Windows\system32\cmd.exe /c net send computernaam bericht > Report.txt" en als "cmd.exe" in je path staat ( wat normaal het geval is) kan het ook zo: Shell "cmd.exe /c net send computernaam bericht > Report.txt"
  • ja dat kan ook, ik wist niet dat dat kon, want ik probeerde het eerst in uitvoeren met 'cmd net send pcnaam bericht' maar toen kon hij cmd niet vinden, betekent dus gewoon dat het goed geformuleerd is, maar daar komt die '/c' dus om de hoek kijken... goed, alleen hoe krijg ik die errorlevel? als ik twee shell opdrachten neerzet: bv zo: shell 'C:\Windows\System32\Cmd.exe /c net send pcnaam bericht > Report.txt' En nee, het vb programma zit zelfs op een andere drive, maar ik heb overal goed de drive/padnaam vermeld, behalve in de shell opdrachten. Misschien is dat de oorzaak. Dat ik report.txt niet kan vinden omdat '> report.txt' in de folder bij het vb programma komt te staan ipv van C:\TBBBG\ waar ik steeds zoek. ik zit nu op een schoolcomputer dus ik kan het nu ff niet testen. over een uurtje denk ik wel. tot zo
  • Die '/c' is wel noodzakelijk omdat cmd anders de opdracht niet uitvoert. Inderdaad, omdat je VB programma op een andere drive/directory staat kan hij report.txt dus niet vinden. Die wordt namelijk in de [i:838cfe24e8]current directory[/i:838cfe24e8] aangemaakt. Dat hoeft dus niet de directory te zijn waar de batch file staat. Maar wat je eigenlijk moet doen is dit: [size=9:838cfe24e8][code:1:838cfe24e8] Private Declare Function OpenProcess Lib "Kernel32" _ (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Private Declare Function GetExitCodeProcess Lib "Kernel32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long ... Function ShellWithExitCode(CommandLine As String) As Long Const STILL_BUSY = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Dim ProcessID As Long Dim hProcess As Long Dim ExitCode As Long ProcessID = Shell(CommandLine, vbHide) hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, _ False, ProcessID) Do DoEvents GetExitCodeProcess hProcess, ExitCode Loop While ExitCode = STILL_BUSY CloseHandle hProcess ShellWithExitCode = ExitCode End Function ... ExitCode = ShellWithExitCode "net.exe send pcnaam bericht" [/code:1:838cfe24e8][/size:838cfe24e8]
  • ja dat klopt ik heb in de installatie map van visual basic gekeken daar staat ie in! dat is de current directory omdat vb hem steeds tijdelijk compilet, als ik hem definitief compile dan zorg ik gewoon dat ie in zn eigen map staat en niemand dus in de weg zit. ik dacht dat cmd de current directory zou bepalen, met als gevolg dat eht hele gebeuren gewoon in C:\TBBBG kwam, maar dat was niet zo, maar goed, ik zet er gewoon het hele pad volgende keer achter de '>' gaat gaat het verzekerd goed. o en [quote:82049b2f67]goed, alleen hoe krijg ik die errorlevel? als ik twee shell opdrachten neerzet: bv zo:[/quote:82049b2f67] hier maakte ik een foutje de tweede shell opdracht was dan: shell "C:\Windows\System32\Cmd.exe /c echo %errorlevel% > C:\TBBBG\Report.txt" maar ik krijg dan vast standaard de waarde 0 in mijn txt bestand geschreven omdat dat weer een nieuwe cmd.exe is. toch?? dus dat werkt niet.
  • hmm, nog echt gevorderd ben ik niet (wat betreft vbkennis dan he:D) ik snap die 'byval' en 'function declare' niet helemaal, ik ga je stukkie code maar eens goed bekijken. ik heb vb6 'het complete handboek' als naslagwerk naast me liggen dus ik kom er wel uit. mijn probleem is dus opgelost! (ff voor de duidelijkheid :wink: ) danku voor alle hulp, AndreasV en Kamikaasje! dag -- sven

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.