Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Interazioni di 2 programmi VB6

Non riesco a risolvere assolutamente il seguente problema, pur avendo 
provato con varie API, tra cui  : OpenProcess, FindWindow, ShellExecute, 
ecc. e con varie istruzioni fra cui SendKeys.
Ho un programma, da me realizzato (lo chiamiamo A) , che - tramite un 
pulsante Command1 - lancia un altro programma EXE, anch'esso da me 
realizzato (lo chiamiamo B).
Il programma B ha un pulsante Command2 che ha l'unica funzione di iconizzare 
B.
Se si preme nuovamente Command1 (del programma A)  non viene lanciata 
un'altra istanza di B ma anzi esso (B) ritorna allo stato normale (non 
iconizzato cioč).
Dulcis in fundo chiudendo il programma A si chiude anche il programma B.
L'unico modo di chiudere il programma B č di farlo chiudendo il programma A.
Un problema apparentemente semplice ma ....
Grazie per l'attenzione
AlpVir


Crei un file in memoria, A e B leggono e scrivono questo file.
In questo file A e B si passano le informazioni: quando A deve
minimizzare, chiudere o fare il caffe' a B e viceversa: se (ipotizziamo)
il file in memoria e' di 4 Byte cosi' strutturato:
Byte 1: stato di A (B non ci scrive, legge solo)
Byte 2: stato di B (A non ci scrive, legge solo)
Byte 3: comando per B (A ci scrive, B "reagisce" al
                                  comando e scrive il byte 1
                                  quando "ha fatto").
Byte 4: comando per A (B ci scrive, A "reagisce" al
                                  comando e scrive il byte 2
                                  quando "ha fatto").
Esempio,
11 00  (A e' aperto e normale, B idem)
11 20  (A e' aperto e chiede a B di minimizzarsi)
12 00  (B ha letto il comando, si e' minimizzato e ha
          azzerato il suo byte "comando")
ecc ecc ecc...
Puoi programmare la scrittura/lettura dei comandi tra i 2 file
con un timer (es. ogni 1/2 secondo leggi e reagisci).

AlpVir ha scritto...

Crei due programmi:
- PrgA: PrgA.exe
    - FrmA: BorderStyle = Sizable - Caption = "B"
        - Command1
- PrgB: PrgB.exe
    - FrmB: BorderStyle = Sizable - Caption = "B"
        - Command2
---------------------------------------------------------------
'Codice FrmA:
Private Const MAX_PATH As Integer = 260
Private Const SW_SHOWNORMAL = 1
Private Const TH32CS_SNAPHEAPLIST = &H1
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPTHREAD = &H4
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or
TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Private Const TH32CS_INHERIT = &H80000000
Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal
lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As
Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As
Long, uProcess As PROCESSENTRY32) As Long
Private 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
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal
nCmdShow As Long) As Long
Private Sub Command1_Click()
    Dim PrgWnd As Long
    Processi "PrgB.exe", PrgWnd
    If PrgWnd = 0 Then
        ShellExecute hwnd, vbNullString, App.Path & "\PrgB.exe",
vbNullString, "", SW_SHOWNORMAL
    Else
        ShowWindow FindWindow(vbNullString, "B"), SW_SHOWNORMAL
    End If
End Sub
Private Function Processi(Optional ByVal wCaption As String, Optional ByRef
Wnd As Long) As Collection
    Dim hSnapShot As Long, uProcess As PROCESSENTRY32, CL As New Collection
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
    uProcess.dwSize = Len(uProcess)
    r = Process32First(hSnapShot, uProcess)
    Do While r
        L = Left(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile,
Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
        If wCaption <> "" Then
            If wCaption = L Then
                Wnd = uProcess.th32ProcessID
                Exit Do
            End If
        Else
            CL.Add L
        End If
        r = Process32Next(hSnapShot, uProcess)
    Loop
    CloseHandle hSnapShot
    If wCaption = "" Then Set Processi = CL
End Function
---------------------------------------------------------------
'Codice FrmB:
Private Sub Command2_Click()
    WindowState = vbMinimized
End Sub
---------------------------------------------------------------
Ciao Fede
By Chicco Production
http://bcp.freetools.it

Errata corrige:
From
    >     - FrmA: BorderStyle = Sizable - Caption = "B"
To
    >     - FrmA: BorderStyle = Sizable - Caption = "A"


 Un problema apparentemente semplice ma ....
Crei due programmi:
- PrgA: PrgA.exe
    - FrmA: BorderStyle = Sizable - Caption = "A"





Private Sub Command1_Click()
    If Processo("PrgB.exe") Then
        ShowWindow FindWindow(vbNullString, "B"), SW_SHOWNORMAL
    Else
        ShellExecute hwnd, vbNullString, App.Path & "\PrgB.exe",
vbNullString, "", SW_SHOWNORMAL
    End If
End Sub
Private Function Processo(ByVal wCaption As String) As Boolean
    If wCaption = "" Then Exit Function
    Dim hSnapShot As Long, uProcess As PROCESSENTRY32
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
    uProcess.dwSize = Len(uProcess)
    r = Process32First(hSnapShot, uProcess)
    Do While r
        If wCaption = Left(uProcess.szExeFile, IIf(InStr(1,
uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1,
0)) Then
            Processo = True
            Exit Do
        End If
        r = Process32Next(hSnapShot, uProcess)
    Loop
    CloseHandle hSnapShot
End Function
---------------------------------------------------------------
'Codice FrmB:
Private Sub Command2_Click()
    WindowState = vbMinimized
End Sub
---------------------------------------------------------------
Ciao Fede



In che modo il programma A "lancia" il programma B?
Usi Shell oppure altro?
Posta del codice.
Ciao
Raf 

Perfetto !  Svolge esattamente quanto da me descritto.
Grazie infinite.
AlpVir 

 Posta del codice.
pazienza :(
-- 
Greg 


Beh, se ha risolto, buon per lui.
Se poi ha comunque capito la soluzione cosě spiattellata senza dilungarsi in
"spiegazioni" ancora meglio! ;-)
Bye
Raf


A Rafunk preciso che uso ShellExecute.
La soluzione proposta da "Fede" soddisfa pienamente quanto da me illustrato,
e non č stato neanche difficile capire come operi il codice per cui non
credo che fosse necessaria, da parte di "Fede" alcuna spiegazione (o
"spiegazioni").
Grazie a tutti.
AlpVir

 AlpVir
Non hai capito nulla; a parte il codice, ovvio :)
E si che la montagna....
Ho visto il sito, davvero carino e ben fatto!
-- 
Greg 

> Non hai capito nulla; a parte il codice, ovvio :)
Forse a causa dell'aria sottile delle alte vette o dell'età.
Chiudo qui.
AlpVir 

Non stare a dargli retta, quando non sanno cosa fare in ufficio,
da bravi dipendenti sfruttano le connessioni per girovagare!
Noi invece operiamo da casa... e per pura passione!


 Noi invece operiamo da casa... e per pura passione!
Scusa Tiscali, ma questo che ci azzecca?
Non  capisco, spero che tu abbia sbagliato reply :(
-- 
Greg 

 Non  capisco, spero che tu abbia sbagliato reply :(
Ti senti chiamato in causa?
Io parlavo con AlpVir di cose nostre!


 Io parlavo con AlpVir di cose nostre!
Ok, scusate se mi sono intromesso
--
greg 

 alcuna spiegazione (o "spiegazioni").
Lo dicevo perché non tutti quelli che scrivono qui sono allo stesso livello,
e quindi in generale non è detto che siano in grado di dedurre la funzione
del codice da una semplice lettura. Specie se ci sono di mezzo le API.
(Lo so, tra le righe si leggeva anche una mezza frecciatina a Tiscali per la
sua abitudine di postare codice già "precotto" e senza commenti ...
spero non me ne voglia! :-P )
Ciao
Raf

 spero non me ne voglia! :-P )
Il codice precotto, è stato prima testato ed eventualmente modificato
secondo necessità. Per quanto riguarda i commenti, li uso solo quando sono
estremamente necessari, il bello di Visual Basic è proprio la sua
leggibilità!


 leggibilità!
:(
CVD 

 ha scritto nel messaggio
news:ga1f8p$snf$
1...@tdi.cu.mi.it

Greg lascia stare!... se mezzo NG l'ha messo nell'ignore un perchè ci sarà!
;-)
-----------------------------
Mio Blog
http://www.martek.it/dblog/default.asp
Mia città
http://wodka40hall.myminicity.com/
***
Best Shit of 2008: DOOMSDAY!
http://www.martek.it/dblog/articolo.asp?articolo=120
 

 ;-)
Ma a chi vuoi darla a bere?
Son contento che certe persone se ne stiano alla larga con i loro simili,
con cui non ho niente da condividere.
Quando imparerete civiltà e umiltà,
ne riparleremo...
...se vorrò!
Ciao grullo!
