Newsgroup: it.comp.lang.visual-basic
Titolo: pgm in vb6 che accetti parametri e restituisca un return code

è possibile realizzare un pgm in vb6, che accetti dei parametri in input e
restituisca al pgm chiamante un codice di ritorno.
questo programma dovrebbe essere richiamato tramite una shell, riceve dei
parametri, e restituisca al chiamante un codice ri ritorno 0 o 1 per
indicare l'esito della lavorazione.
ora so come richiamare un ex passando dei parametri e come in un pgm vb6
ricevere dei parametri, ma non so come restituire un codice di ritorno e
come il chiamante possa leggere questo dato.
grazie
Stefy
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Da quello che so io con VB6 devi ricorrere sempre alle classiche finestre o 
messagebox per visualizzare un risultato.
Con 
VB.NET
 tutto ciň si risolverebbe in 2 minuti con la creazione di 
un'applicazione console.
Ciao, Vincenzo 


ha scritto:

Non ho grande pratica di net, perciň chiedevo in vb6.
Ma se magari puoi darmi un esempio con 
vb.net
, grazie


 come il chiamante possa leggere questo dato.
Tramite l'istruzione Command invii parametri in ingresso al programma.
Inserisci all'interno del programma chiamante una istruzione del tipo:
    If App.Path & "\log.txt" <> "" Then Kill App.Path & "\log.txt"
Inserisci all'interno del programma chiamato una istruzione del tipo:
    Private Sub Lavorazione(ByVal Parametri As String)
        ff = FreeFile
        On Error GoTo Errore
        '<<Lavorazione>>
        Open App.Path & "\log.txt" For Output As #ff
            Print #ff, "OK"
        Close #ff
        Exit Sub
    Errore:
        Open App.Path & "\log.txt" For Output As #ff
            Print #ff, Err.Number & ": " & Err.Description
        Close #ff
    End Sub
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 come il chiamante possa leggere questo dato.
Io userei una delle seguenti opzioni (in base a ciò che devi fare
ovviamente):
-Tabella su DB che mi tiene il log di quanto sta succedendo
-File di testo che contiene i dati necessari a capire cosa sta succedendo
-Comunicazione socket tra i due programmi
Nicola


Cercando su Google trovi tanti esempi, altrimenti sono 2 cose veramente.
1) Crei un'applicazione console
2) Nel sub Main del modulo aggiungi questa riga:
Console.WriteLine(String.Format("Ciao {0}", Command()))
La funzione command restituisce l'elenco dei parametri passati da riga di 
comando.
Ciao, Vincenzo 

Ovviamente dopo l'istruzione...
    If App.Path & "\log.txt" <> "" Then Kill App.Path & "\log.txt"
...nel programma chiamante,
puoi mettere per esempio il seguente codice:
    Do: DoEvents: Loop Until Dir(App.Path & "\log.txt") <> ""
    ff = FreeFile
    Open App.Path & "\log.txt" For Binary As ff
        i = Input(LOF(ff), #ff)
    Close #ff
    If Left(i, 2) = "OK" Then
        MsgBox "Procedura ultimata con successo."
    Else
        MsgBox "Si è verificato un errore: " & i
    End If


 --------------------------------
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As
Long)
ExitProcess <ErrorLevel da restituire all'esterno>
Bye by SixaM 8-]
P.S. Occhio che questa API butta giu' la tua applicazione di botto, e
quindi devi essere tu a liberare in maniera esplicita tutte le risorse
prima dell'uscita.

 come il chiamante possa leggere questo dato.
I codici di ritorno gli scrivi su un file specifico, il cui percorso
potrebbe essere direttamente passato dal chiamante fra i vari parametri
Shell tuo.exe param1 param2 percorsoout
shell tuo.exe Pippo pluto C:\Output.txt

 Stefy
Per restituire un codice di uscita, come già indicato da sixam, puoi usare 
l'api ExitProcess.
Per leggere tale codice di uscita dal chiamante, si può usare l'api 
GetExitCodeProcess (insieme a OpenProcess).
Es.
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) 
As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess 
As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess 
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const STILL_ACTIVE = &H103&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim idProc As Long
Dim hProc As Long
    idProc = Shell("C:\Test\Mioprog.exe param1 param2...")
    hProc = OpenProcess(PROCESS_ALL_ACCESS, False, idProc)
    If hProc <> 0 Then
        Do
            GetExitCodeProcess hProc, iExit
        Loop Until iExit <> STILL_ACTIVE
        CloseHandle hProc
        MsgBox "Codice di uscita: " & CStr(iExit)
    End If
Bye
Raf 


grazie a tutti



sei certo che l'esempio sia ok??
ho provato ad eseguirlo, creando un pgm che crea un codice di uscita ma non
riesco a catturare il return code. A parte che non capisco l'uso della
variabile hProc, che non si valorizza e quindi fallisce la if per
l'esecuzione della shell, ma anche forzando questa variabile con un valore
per rendere vera la if, niente viene eseguita la shella ma non torna nessun
valore.
questo è il codice del pgm chiamato che torna il return code
Option Explicit
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Public Sub Main()
    Dim rc As Long
    rc = 1
    Call ExitProcess(rc)
End Sub
e questo è il tuo esempio per il test
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess
As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const STILL_ACTIVE = &H103&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim idProc As Long
Dim hProc As Long
Sub esegui()
    Dim a As String
    Dim a2 As String
    'idProc = Shell("d:\Test\Mioprog.exe param1 param2...")
    idProc = Shell("d:\testVB\aps\testa\check.exe ")
    hProc = OpenProcess(PROCESS_ALL_ACCESS, False, idProc)
    If hProc <> 0 Then
        Do
            GetExitCodeProcess hProc, iExit
        Loop Until iExit <> STILL_ACTIVE
        CloseHandle hProc
        MsgBox "Codice di uscita: " & CStr(iExit)
    End If
End Sub
Private Sub Command1_Click()
Call esegui
End Sub


 la shella ma non torna nessun valore.
hProc è l'handle del processo.
http://msdn.microsoft.com/en-us/library/ms684320.aspx
A parte che non puoi imporgli un valore arbitrario tu, se OpenProcess 
ritorna hProc=0 può voler dire che:
a) il processo avviato con shell è già terminato
b) non è mai partito perché Shell è fallita (in tal caso idproc=0)
c) c'è stato un errore: in questo caso puoi ispezionare Err.LastDLLError per 
capire il codice di errore Win32.
Ho provato il tuo codice papale papale (con l'aggiunta di cui sopra) e da me 
funziona...
Ciao
Raf