Newsgroup: it.comp.lang.visual-basic
Titolo: Scambio di dati tra programmi

Salve, io ho un programma che ne lancia un'altro in shell ed attende il suo
termine.
Come faccio a spedire una stringa di ritorno al programma chiamante?
Purtroppo non posso usare il socket per far colloquiare i due programmi, ma
avrei bisogno di qualche API per creare un canale di scambio informazioni.
Grazie
Tango

Voglio saperlo anche io
                        danilo

Tango ha scritto:

Potresti usare una pipe.
HOWTO: Use Named Pipes in a Visual Basic 32-bit Program (Q177696)
http://support.microsoft.com/support/kb/articles/Q177/6/96.ASP
-- 
hth, hal

 wrote in message
a3o5ne$19bvon$1...@ID-56381.news.dfncis.de...

Ma scusatemi ... ma non č meglio usare Sendkeys ?????
'programma  lanciante
Private Sub Form_Activate()
Text1.SetFocus
End Sub
'programma lanciato
private sub form_unload()
appacrivate "NOME PROGRAMMA LANCIANTE",true
sendkeys "mi sono spento",true
end sub
Quando il programma lanciante riceve il focus lo attiva sul text1 e scarica
la stringa altrimenti puoi usare i Link

Ma scusatemi ... ma non č meglio usare Sendkeys ?????
Auguri ;-)
-- 
ciao, hal


E condoglianze :PP
Ciaotutti,
*

 wrote in message
a3ooj5$1a9upk$1...@ID-56381.news.dfncis.de...

Apparte che ho scritto appacrivate=Appactivate
Lo provato 10 minuti fa, funziona,,,,,
forse sono stati i tuoi Auguri ... :-)

forse sono stati i tuoi Auguri ... :-)
... ma non funziona _sempre_.
-- 
ciao, hal

 wrote in message
a3osco$1a14jg$1...@ID-68324.news.dfncis.de...

.... invece di dire str...........te date voi una soluzione ..... questo è
un NG ...
o è un posto dove si dicono delle gran Min......te

o č un posto dove si dicono delle gran Min......te
Sei sicuro di di non essere tu quello che le sta dicendo ?
-- 
ciao, hal

sai cosa testina mi stai gia sul cazzoooo


e adesso mettimi l'accento sul "GIA" testa di cazzo

sai cosa testina mi stai gia sul cazzoooo
Bene bene, mi mancava un bel
PLONK
-- 
L' ultima battuta perche' poi non ti potro' piu' rispondere:
INFO: Interprocess Communication on Windows Platforms 
Q95900
http://support.microsoft.com/support/kb/articles/Q95/9/00.ASP

 Come faccio a spedire una stringa di ritorno al programma chiamante?
Se le due applicazioni sono sulla stessa macchina,
un messaggio WM_COPYDATA e' piu' che sufficiente.
Se, invece, sono su macchine distinte usa le pipe
come ti e' gia' stato suggerito.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 la stringa altrimenti puoi usare i Link
E' una soluzione, ma non č la migliore. Immaginiamo che il programma
lanciato faccia una lunga elaborazione, al termine della quale deve
restituire l'output al programma lanciante.
Se nel frattempo l'utente decide di mettersi a scrivere una lettera su di un
word-processor, e per caso preme un tasto (magari ctrl-v) mentre avviene
l'AppActivate, il risultato dell'elaborazione č invalidato.
SendKeys č (a mio parere) da evitare accuratamente. Nello stesso modo
bisognerebbe evitare accuratamente di dare pubblicamente a chicchessia della
"testa di cazzo".
Ciao
*Roby*

I due exe sono sulla stessa macchina, qundi potrebbe andare benissimo la tua
soluzione.
Non č che mi potresti fare un'esempio (anche il piů semplice possibile) di
come posso usare la tua soluzione?
Tieni presente che il programma "chiamante" lancia in shell il "chiamato"
con parametri della riga di comando, e poi aspetta una stringa di ritorno
(che non devo scrivere in nessun controllo ma sono dati per delle
variabili...)
Grazie per l'aiuto.
Byez
Tango

Mi sà che hai scelto la persona sbagliata per fare polemica.
Non so se te ne sei accorto ma, mentre tu dai dei consigli, lui ti risponde
con citazioni e link a siti che trattano l'argomento.
Invece di arrabbiarti cerca di essere un pò più rispettoso e di trarre
insegnamento.
Ciao, Claudio.

come posso usare la tua soluzione?
Sicuramente.
Come esempio ti basta creare due applicazioni A e B (la
prima che invia il messaggio e la seconda che lo riceve).
L'applicazione A spedisce un messaggio alla pressione di un
bottone e l'applicazione B, ricevuto il messaggio, lo
visualizza.
Aggiungi, quindi, un bottone e nel codice del Form1
dell'applicazione A scrivici:
'start of code
Private Type COPYDATASTRUCT
             dwData As Long
             cbData As Long
             lpData As Long
End Type
Private Const WM_COPYDATA = &H4A
Private Declare Function FindWindow Lib "user32" Alias _
               "FindWindowA" (ByVal lpClassName As String, _
                              ByVal lpWindowName _
                              As String) As Long
 
Private Declare Function SendMessage Lib "user32" Alias _
  "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
                  ByVal wParam As Long, _
                  lParam As Any) As Long
 
Private Declare Sub CopyMemory Lib "kernel32" Alias _ 
   "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, _
                    ByVal cbCopy As Long)
 
Private Sub Command1_Click()
        Dim cds As COPYDATASTRUCT
        Dim ThWnd As Long
        Dim buf(1 To 255) As Byte
        ' cerchiamo la finestra a cui spedire il messaggio
        ThWnd = FindWindow(vbNullString, "Destinazione")
        a$ = "Funziona !"        
        Call CopyMemory(buf(1), ByVal a$, Len(a$))
        cds.dwData = 3
        cds.cbData = Len(a$) + 1
        cds.lpData = VarPtr(buf(1))
        i = SendMessage(ThWnd, WM_COPYDATA, Me.hwnd, cds)
End Sub
'end of code
Fatto questo, crea l'applicazione B, il cui Form1 DEVE avere
come Caption "Destinazione".
Nel codice del Form1 ci scrivi:
'start of code
 Private Sub Form_Load()
          gHW = Me.hwnd
          Hook
          Me.Caption = "Destinazione"
          Me.Show
      End Sub
 
 Private Sub Form_Unload(Cancel As Integer)
          Unhook
 End Sub
'end of code
Aggiungi un modulo al progetto e scrivici:
'start of code
Type COPYDATASTRUCT
     dwData As Long
     cbData As Long
     lpData As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_COPYDATA = &H4A
Global lpPrevWndProc As Long
Global gHW As Long
 
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
_
         (hpvDest As Any, hpvSource As Any, ByVal cbCopy As
Long)
 
Declare Function CallWindowProc Lib "user32" Alias _
         "CallWindowProcA" (ByVal lpPrevWndFunc As Long,
ByVal hwnd As _
         Long, ByVal Msg As Long, ByVal wParam As Long,
ByVal lParam As _
         Long) As Long
 
Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA" _
         (ByVal hwnd As Long, ByVal nIndex As Long, ByVal
dwNewLong As _
         Long) As Long
 
Public Sub Hook()
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
                                     AddressOf WindowProc)
End Sub
Public Sub Unhook()
       Dim temp As Long
       temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
                    ByVal wParam As Long, ByVal lParam As
Long) As Long
 
         If uMsg = WM_COPYDATA Then
             Call mySub(lParam)
         End If
         WindowProc = CallWindowProc(lpPrevWndProc, hw,
uMsg, wParam, _
                                     lParam)
End Function
Sub mySub(lParam As Long)
    Dim cds As COPYDATASTRUCT
    Dim buf(1 To 255) As Byte
 
    Call CopyMemory(cds, ByVal lParam, Len(cds))
 
    If (cds.dwData = 3) Then
       Call CopyMemory(buf(1), ByVal cds.lpData, cds.cbData)
       a$ = StrConv(buf, vbUnicode)
       a$ = Left$(a$, InStr(1, a$, Chr$(0)) - 1)
       Form1.Print a$
    End If
End Sub
'end of code
Crea gli eseguibili di entrambe le applicazioni, lanciali e
prova a premere il bottone sulla prima applicazione.  Sulla
seconda apparira' la stringa di testo.
In ogni caso, se vuoi, ti impacchetto tutto e te lo mando
per e-mail.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

" were inserted in Bozo
Bin.
Bye, G.


Potresti usare il DDE, oppure usare la funzione Sleep, per sospendere il
programma chiamante fino al termine dell'esecuzione del chiamato, e far
scrivere a questo, prima di terminare, su di un file la stringa di ritorno
che a quel punto il chiamante andrà a leggere.

 wrote in message
Y0588.26250$5M4.8...@twister2.libero.it...

Bene ... questo è lo spirito di un NG .... a me da fastidio chi invece di
rispondere con degli esempi o consigli critica
chi scrive o addirittura come è successo nel mio caso mi corregga gli errori
ortografici.
Questo da quello che ho capito è un NG sulla programmazione in VB .... non
sulla lingua italiana
Comunque chiedo scusa a tutti ..... per quello che ho detto ....
Ciao

 del chiamato
Sleep non e' la funzione migliore, perche' non da' 
garanzia che l'eseguibile lanciato sia effettivamente
terminato.  Per questo scopo si usa WaitForSingleObject.




Non si potrebbe usare un server ACTIVE X?

Non si potrebbe usare un server ACTIVE X?
Certamente :-)
-- 
ciao, hal

Infiniti grazie per l'esempio... a buon rendere! :)
Ciao e grazie ancora!!!
Tango

Ringrazio tutti per gli utili (e tempestivi) consigli su come posso
risolvere il problema.
Spero che arrivi presto il mio turno di aiutare qualcuno di voi.
Grazie!
Tango