Newsgroup: it.comp.lang.visual-basic
Titolo: Applicazione NON deve partire 2 volte!

Ciao...
Come si fa a fare in modo che una applicazione VB6, dalla stessa path, non 
possa partire due volte?
Mi spiego:
Ho messo l'iconcina della mia applicazione in VB6 nella barra di avvio 
veloce.
Ogni tanto mi scappa sopra il MOUSE e la clicko un'altra volta... questo mi 
causa un crash nel database...
Se comunque faccio partire la stessa applicazione da un'altra path... 
evidentemente nessun problema e qui deve funzionare.
Come potrei intercettare che sta partendo dalla stessa path già in 
esecuzione ed uscire prima di far danno?
DANNO = Se l'applicazione parte con lo stesso database una seconda volta, il 
dabse, mi avvisa di errore ma è anche a zero, qui se per caso salvo un dato 
nel database,,,, mi azzera tutti i dati presenti nel database..  arghhh
Quindi devo per forza evitare questo fattaccio!
Grazie
ciao
----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com
 The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----

 possa partire due volte?
Io cercherei nella lista dei task attivi.
Inoltre, poichè deve poter partire anche da altre path, metterei nella 
caption del form principale un riferimento alla path in cui mi trovo.
Se, quando listo tutti i task, trovo un'altro task con il riferimento a 
quella path allora chiudo automaticamente l'applicazione (prima di aver 
eseguito qualunque altra operazione).
Non so se esistono altri metodi più raffinati. Per ora mi viene in mente 
solo questo.
bye
-- 
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it
Sinapsi Antispam. Antispam Gratuito.
http://www.sinapsi-antispam.tk
http://www.nicolaottomano.it/sinapsi.htm
Ingrosso Orologi.
http://www.supertop.it
email spamtrap: 
spam...@nicolaottomano.it

 evidentemente nessun problema e qui deve funzionare.
Evidentemente? Spero di non essere mai fra gli utenti di tale app...
Scusa la rudezza, ma ti stai ponendo dei problemi che non dovrebbero
mai esistere.
-- 
ciao, hal


Io penso che ci si debba aiutare non insultarsi, ho fatto una sub per 
verificare se un task è in corso eccola
'nel modulo bas:
'dichiarazione per cistagia
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, 
ByVal wCmd As Long) As Long
    Private Declare Function GetWindowLong Lib "user32" Alias 
"GetWindowLongA" (ByVal hwnd As Long, ByVal wIndx As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias 
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpSting As String, ByVal 
nMaxCount As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias 
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Const GW_HWNDFIRST = 0          ' Get first Window handle
Const GW_HWNDNEXT = 2           ' Get next window handle
Const GWL_STYLE = (-16)         ' Get Window's style bits
Dim IsTask As Long              ' Style bits for normal task
' The following bits will be combined to define properties
' of a 'normal' task top-level window.  Any window with ' these set will be
' included in the list:
Const WS_VISIBLE = &H10000000      ' Window is not hidden
Const WS_BORDER = &H800000         ' Window has a border
la subroutine:
Public Sub Cistagia()
  Dim hwCurr As Long
    Dim intLen As Long
    Dim strTitle As String
    Dim trovato As Boolean
    ' process all top-level windows in master window list
    'lstApp.Clear
    trovato = False
    'hwCurr = GetWindow(Me.hWnd, GW_HWNDFIRST)  ' get first window
    hwCurr = GetWindow(Form1.hwnd, GW_HWNDFIRST)  ' get first window
    Do While hwCurr  ' repeat for all windows
      'If hwCurr <> Me.hWnd And TaskWindow(hwCurr) Then
      If hwCurr <> Form1.hwnd And TaskWindow(hwCurr) Then
        intLen = GetWindowTextLength(hwCurr) + 1 ' Get length
        strTitle = Space$(intLen) ' Get caption
        intLen = GetWindowText(hwCurr, strTitle, intLen)
        If intLen > 0 Then ' If we have anything, add it
          'lstApp.AddItem strTitle
          If InStr(UCase$(strTitle), "VISORE IMMAGINI BY TN") Then
           ' Form1.Hide
            'About.Show
            'MsgBox "Vedimag è già in corso"
            n = MsgBox("Vedimag è già in corso, vuoi aprire un'altra 
finestra?" _
            , vbYesNo)
            If n <> 6 Then End
            Exit Sub
            trovato = True
          End If
    ' and let's save the window handle in the itemdata array
          'lstApp.ItemData(lstApp.NewIndex) = hwCurr
        End If
      End If
      hwCurr = GetWindow(hwCurr, GW_HWNDNEXT)
    Loop
    'If trovato = False Then MsgBox "Non ci sta"
End Sub
Variala oppurtunamente secondo i tuoi bisogni.
Ciao Peppe

 'nel modulo bas:
OK!...lodevole cosa....
ma forse li bastava un unica istruzione App.previnstance?
Non ha parlato di lanciare servizi ma solo programmi!
ho preparato un piccolissimo codice VB6 sp5
Una form dentro incolla:
Option Explicit
Private Sub Form_Paint()
    Dim Messaggio As String
    Messaggio = "Eccomi qua ...lanciato or ora!"
    CurrentX = (ScaleWidth - TextWidth(Messaggio)) / 2
    CurrentY = (ScaleHeight - TextHeight(Messaggio)) / 2
    Print Messaggio
End Sub
Private Sub Form_Resize()
    Refresh
End Sub
Un modulo bas
dentro incolla:
Option Explicit
Sub Main()
If App.PrevInstance Then
    MsgBox "programma già in esecuzione", vbCritical, "ATTENZIONE!!!"
    End
End If
Form1.Show
End Sub
Imposta che parta il progetto da main.
Compila ed esegui quante volte vuoi...guarda che succede!
Ciao!
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

In effetti...
Come ti hanno già suggerito basta controllare se App.previnstance è TRUE,
anche nell'evento load del form di avvio della tua applicazione... 
In questo caso tu non fai nessuna operazione sul database, magari
avvertendo l'utente che c'è già aperta, e uscendo direttamente da questa
seconda istanza.
Paolo.

 Io penso che ci si debba aiutare non insultarsi
Insultarsi? E' esploso un'altro container di etanolo? :(


 Non ha parlato di lanciare servizi ma solo programmi!
Scusa wodka, ma la previnstance vale solo per uno specifico file exe 
oppure se ho due eseguibili identici in due cartelle diverse li vede 
come un'unica applicazione?


 sputtanare un database, ehm... con quale piede hai scritto?
Sono d'accordo, il problema secondo me sta a monte.
Io rivedrei il progetto.
Saluti.

 come un'unica applicazione?
selo stesso exe è in 2 cartelle diverse previnstance non funziona.
nic, la tua firma è il triplo di quella usuale. 11 linee...
ciao, j.

 nic, la tua firma è il triplo di quella usuale. 11 linee...
Hai ragione. Per qualche motivo non ho mai avuto tempo e voglia di 
pulirla. cosiì va meglio?
bye
-- 
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it
Sinapsi Antispam. Antispam Gratuito.
http://www.sinapsi-antispam.tk
email spamtrap: 
spam...@nicolaottomano.it

 selo stesso exe è in 2 cartelle diverse previnstance non funziona.
uhm, in tal caso la soluzione sicura e portabile da un win all'altro
e` creare un mutex
-- 
ciao, hal

 ha scritto nel messaggio
news:cYt3e.32982$kC3....@tornado.fastwebnet.it...

cioè  ?

 mai esistere.
Nessun problema... ci mancherebbe... è appunto per questo che chiedo sempre 
informazioni aiuto a chi ne sa di più.. sperando di non rompere troppo... ma 
chi vuole aiutare lo fa sempre gentilmente...
Comunque anche VB6 se per caso apri due volte lo stesso progetto ti dice che 
è già aperto ed esce... non è che sono così fuori strada...
---VB6 cut---
File 'nome file' già aperto
Cause e soluzione dell'errore:
Si è cercato di caricare due file di progetto con lo stesso nome nello 
stesso gruppo di progetti.
Si è cercato di salvare due progetti con lo stesso nome nello stesso gruppo 
di progetti.
[...]
---cut---
:-))
ciao e grazie MILLLLLLE a tutti per l'aiuto!
Anto


 chi vuole aiutare lo fa sempre gentilmente...
A volte e` piu` istruttivo uno schiaffo ben metabolizzato che
un giro di parole per dire di fatto nulla.
-- 
ciao, hal

 cioè  ?
Poiche` un mutex puo` essere posseduto da un solo processo per volta,
i tentativi di creazione del mutex successivi al primo sono destinati
a fallire. Si ha cosi` la certezza che esiste in memoria un'altra
istanza della propria applicazione senza distinzione da dove (e pure
con quale nome, se al mutex viene assegnato un nome fisso) sia
stata avviata.
-- 
ciao, hal

"hal1961" <hal1961@abcdefghijklmnopqrstuvwxyzabcdefghijklmnop> wrote in
message news:gqv3e.33121$
kC3...@tornado.fastwebnet.it

La spiegazione è molto chiara, ma non avendo mai usato i Mutex
ho qualche limite.
Hai la possibilità di darmi un Riferimento purtroppo ho un problema
simile che tentai di tamponare ciclando i Processi nella SubMain
ma il processo si apre ugualmente per poi chiudersi(come ovvio sia).
Da quanto capito invece quello che accenni fà fallire completamente
il tentativo di apertura della 2° istanza e forse potrebbe fare al caso
mio.
Grazie.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

ApipApip wrote:
non l'avevo mai fatto ne mi ero posto il problema!
nel mio Win2kpro...se metto il solito exe in dir diverse il codice di sopra
funziona!
Invece se uno lo chiamo pippotest.exe e uno plutotest.exe prevInstance è
fottuto...
come diceva HAL ho cercato un po su Google
alla fine
http://www.vbaccelerator.com/home/VB/Code/Libraries/Shell_Projects/Registering_File_Associations/article.asp
che applicato al caso specifico del programma di sopra diventa:
nel modulo.bas
Option Explicit
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" _
   (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal
lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Const ERROR_ALREADY_EXISTS = 183&
Private m_hMutex As Long
Private m_bInDevelopment As Boolean
'Cambia questa linea per assegnare un nome convenzionale
' univoco al tuo programma
Private Const mcTHISAPPID = "Wodkatest001"
Sub Main()
If App.PrevInstance Then
    MsgBox "programma già in esecuzione", vbCritical, "ATTENZIONE!!!"
    End
End If
  ' Check if this is the first instance:
   If (WeAreAlone(mcTHISAPPID & "_APPLICATION_MUTEX")) Then
      ' Do startup code here:
      Form1.Show
   Else
      ' Pass command line if not empty, or
      ' activate
      MsgBox "Attenzione prevInstance fregato... " + vbCrLf + " ma il mutex
è scattato! Applicazione già in esecuzione", vbCritical, "PRRRRRRRRRRR!"
    End If
End Sub
Private Function WeAreAlone(ByVal sMutex As String) As Boolean
   ' Don't call Mutex when in VBIDE because it will apply
   ' for the entire VB IDE session, not just the app's
   ' session.
   'UNICA PECCA...i mutex non vanno chiamati dentro l'IDE
   If InDevelopment Then
      WeAreAlone = Not (App.PrevInstance)
   Else
      ' Ensures we don't run a second instance even
      ' if the first instance is in the start-up phase
      m_hMutex = CreateMutex(ByVal 0&, 1, sMutex)
      If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
         CloseHandle m_hMutex
      Else
         WeAreAlone = True
      End If
   End If
End Function
Public Function InDevelopment() As Boolean
   ' Debug.Assert code not run in an EXE. Therefore
   ' m_bInDevelopment variable is never set.
   Debug.Assert InDevelopmentHack() = True
   InDevelopment = m_bInDevelopment
End Function
Private Function InDevelopmentHack() As Boolean
   ' .... '
   m_bInDevelopment = True
   InDevelopmentHack = m_bInDevelopment
End Function
Public Function EndApp()
   ' Call this to remove the Mutex. It will be cleared
   ' anyway by windows, but this ensures it works.
   If (m_hMutex <> 0) Then
      CloseHandle m_hMutex
   End If
   m_hMutex = 0
End Function
il form il solito
Option Explicit
Private Sub Form_Paint()
Dim Messaggio As String
Messaggio = "Eccomi qua ...lanciato or ora!"
CurrentX = (ScaleWidth - TextWidth(Messaggio)) / 2
CurrentY = (ScaleHeight - TextHeight(Messaggio)) / 2
Print Messaggio
End Sub
Private Sub Form_Resize()
Refresh
End Sub
Imposta start del programma  dalla sub main
Beh ganzo!...funziona!
Se funziona il mutex sotto tutti i SO non lo so!
Qui attendo lumi da HAL!
Saluti a tutti!
(wodkino un po triste un po "cosmico" stasera)
------------------------

 Se funziona il mutex sotto tutti i SO non lo so!
Tranquillo, da windows 95 in poi.
-- 
ciao, hal