Newsgroup: it.comp.appl.access
Titolo: chiudere tutte le istante access aperte

Buonasera,
dovendo permettere al pacchetto autoinstallante di sovrascrivere gli mdb 
presenti, spesse capita che l'installazione dell'aggiornamento si blocca sul 
classico Riprova/Annulla... perche' un'istanza access si trova ancora 
aperta.
 
Mi pare di ricordare che in paddato, qualcuno aveva pubblicato la 
possibilita' di chiudere automaticamente tutte le istante aperte di access.
 
Qualcuno saprebbe darmi qualche riferimento?
 
Grazie infinite.
Marco67
 
 


Manca qualche INFO... 
Da dove lanci questa cosa...? Perchè se da Access vuoi chiudere Access... lo comprendi anche tu che potrebbe essere più difficile...!
 
Se ad esempio crei un VBS che chiude access e lo lanci allora la cosa è più semplice...
 
'Killare un EXE
Dim obj As Object
For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='msaccess.exe'")
obj.Terminate
Next
End Sub
 
Per il resto se magari hai un INSTALLER puoi vedere se supporta codice e farlo fare a lui... oppure come PREINSTAL esegui il VBS...
 
@Alex

 Marco67
 
Manca qualche INFO...
Da dove lanci questa cosa...? Perchč se da Access vuoi chiudere Access... lo 
comprendi anche tu che potrebbe essere piů difficile...!
 
Se ad esempio crei un VBS che chiude access e lo lanci allora la cosa č piů 
semplice...
 
'Killare un EXE
Dim obj As Object
For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM 
Win32_Process WHERE Name='msaccess.exe'")
obj.Terminate
Next
End Sub
 
Per il resto se magari hai un INSTALLER puoi vedere se supporta codice e 
farlo fare a lui... oppure come PREINSTAL esegui il VBS...
 
@Alex
 
Grazie davvero Alex,
in effetti potrei lanciare un eseguile dal mio installer, ho visto che puo' 
tranquillamente farlo.
 
A questo punto pero' mi viene in mente un'altra cosa:
potrebbe essere ancora piu' importante forzare la chiusura di eventuali 
istanze aperte prima dell'uscita del mio appl. principale, (quello che per 
me e' il 'menu'), ho notato infatti che un'istanza rimasta appesa 'consuma' 
risorse al processore...
 
Potrei individuare il num. di riferimento o quant'altro, con la quale potrei 
utilizzare la routine che mi hai fornito all'interno del mio 'menu', 
escludendolo chiaramente con una if...then... per saltarlo ed evitare 
conflitti?
 
Spero di essermi spiegato...
 
Grazie ancora
-- 
 
 

 --
 
Non ho ben chiaro lo scenario.
Di solito io faccio una cosa simile...:
Nel CLIENT(perchè è l'unico che deve chiudersi, il Server o BE no ne ha bisogno)... scrivo una Rotuine che legge una Tabella del SERVER, in questa Tabella ho 2 Campi(semplifico)...
USER
LOGOFF
 
Dal Client, ho una Form HIDDEN in cui gira su TIMER una routine con cui interrogo la Tabella con CRITERIO=USER e se il campo LOGOFF=TRUE attivo il Conteggio di LOGOFF forzato in x Minuti(in realtà ho anche un campo TEMPO ma cambia poco...).
 
Quindi se dal tuo installer, vai a scrivere TRUE su tutti gli USERS... poi i CLIENT in automatico in X Tempo si chiudono.
Ritardi l'installer del Tempo di sicurezza poi, se esiste, provi a KILLARE il file LDB/LACCDB e se non esiste o lo riesci a cancellare procedi.
 
Io usavo INNOSETUP come Installer e potevo eseguire addirittura codice per scrivere nel Database di Access con ADO.
 
Queste cose vanno pensate sempre in modo un po strutturato...
 
@Alex

 ha scritto nel messaggio 
news:fa3e99c5-4869-4113...@googlegroups.com...

Anch'io utilizzo InnoSetup, con l'interfaccia piu' intuitiva IsTool, non ho 
mai provato a smanettarci e vedro' di implementae questi controlli.
Questo stratagemma e' davvero intelligente, che appunto si rende 
fondamentale per non trovare aperti, quindi non sovrascribili, gli accdb 
durante reinstallazione/sovrascrittura .
 
Ma quello che intendevo fare e' questo:
Visto che le istanze rimangono aperte inspiegabilemnte all'uscita delle mie 
procedure, e visto che se rimangono li, rubano non poche risorse al sistema, 
avevo bisogno di individuare il numero di istanza assegnata al mio 
'menu.mdb', affinche' cliccando sul pulsante di uscita, mi 'killasse' tutte 
le eventuali istanze 'msaccess.exe' aperte (saltando quella corrente del 
menu ovviamente, che da li' a bereve si chiudera' sicuramente: si tratta di 
un piccolo mdb e non mi ha mai dato problemi).
 
pertanto, la routine seguente che mi hai suggerito:
 
Dim obj As Object
For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM 
Win32_Process WHERE Name='msaccess.exe'")
obj.Terminate
Next
End Sub
 
... mi piacerebe potessi utilizzarla killando tutte le istanze msaccess.exe 
diverse da quella corrente, attraverso un normale if.. then else...
 
Che dici?
Si puo' fare no?
 
Smanettando sul web ho trovato, anche se in inglese, una routine scritta a 
suo tempo da Dev Ashish, che permette di tirar fuori il codice di istanza 
del mdb corrente (almeno cosi' ho capito=, ma proprio non mi riesc capirci 
qualcosa e come utilizzarla (ammesso che sia il passo giusto??)
eccola di seguito:
 
'************** Code Start ***************
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Declare Function apiGetClassName Lib "user32" Alias _
                "GetClassNameA" (ByVal Hwnd As Long, _
                ByVal lpClassname As String, _
                ByVal nMaxCount As Long) As Long
Private Declare Function apiGetDesktopWindow Lib "user32" Alias _
                "GetDesktopWindow" () As Long
Private Declare Function apiGetWindow Lib "user32" Alias _
                "GetWindow" (ByVal Hwnd As Long, _
                ByVal wCmd As Long) As Long
Private Declare Function apiGetWindowLong Lib "user32" Alias _
                "GetWindowLongA" (ByVal Hwnd As Long, ByVal _
                nIndex As Long) As Long
Private Declare Function apiGetWindowText Lib "user32" Alias _
                "GetWindowTextA" (ByVal Hwnd As Long, ByVal _
                lpString As String, ByVal aint As Long) As Long
Private Const mcGWCHILD = 5
Private Const mcGWHWNDNEXT = 2
Private Const mcGWLSTYLE = (-16)
Private Const mcWSVISIBLE = &H10000000
Private Const mconMAXLEN = 255
 
Function fEnumWindows()
Dim lngx As Long, lngLen As Long
Dim lngStyle As Long, strCaption As String
 
    lngx = apiGetDesktopWindow()
    'Return the first child to Desktop
    lngx = apiGetWindow(lngx, mcGWCHILD)
 
    Do While Not lngx = 0
        strCaption = fGetCaption(lngx)
        If Len(strCaption) > 0 Then
            lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
            'enum visible windows only
            If lngStyle And mcWSVISIBLE Then
                Debug.Print "Class = " & fGetClassName(lngx),
                Debug.Print "Caption = " & fGetCaption(lngx)
            End If
        End If
        lngx = apiGetWindow(lngx, mcGWHWNDNEXT)
    Loop
End Function
Private Function fGetClassName(Hwnd As Long) As String
    Dim strBuffer As String
    Dim intCount As Integer
 
    strBuffer = String$(mconMAXLEN - 1, 0)
    intCount = apiGetClassName(Hwnd, strBuffer, mconMAXLEN)
    If intCount > 0 Then
        fGetClassName = Left$(strBuffer, intCount)
    End If
End Function
 
Private Function fGetCaption(Hwnd As Long) As String
    Dim strBuffer As String
    Dim intCount As Integer
 
    strBuffer = String$(mconMAXLEN - 1, 0)
    intCount = apiGetWindowText(Hwnd, strBuffer, mconMAXLEN)
    If intCount > 0 Then
        fGetCaption = Left$(strBuffer, intCount)
    End If
End Function
 
 
 

Marco, qualche cosa mi SFUGGE.
 
Parliamo di ISTANZE o di CONNESSIONI...?
 
Le connessioni sono attive sul SERVER, possono CRASHARE e mantenere bloccato il file SERVER(BE).
 
Le istanze del processo di ACCESS invece sono aperte sui CLIENT e non sul SERVER... quindi non puoi usare alcun codice per chiudere ISTANZE di processi su PC remoti semplicemente perchè non le vedi.
 
Quindi che tu abbia MOLTE ISTANZE aperte su un solo PC è un probelma che deve essere risolto in altro modo, cercando di capire il motivo e risolvendolo.
 
Ora ho più confusione di prima...
 
@Alex

 ha scritto nel messaggio 
news:303cf39d-2e1a-4e8e...@googlegroups.com...

Ti chiedo scusa Alex,
capisco che vado un po' d'imbracciatura e do per scontato..
 
Allora:
si, sto parlando delle istanze client, che vedo rimanere aperte attraverso 
il task manager sulla postazione di lavoro: non sono molte, principalmente 
una quasi sempre non si chiude.
Gia' in passato avevo postato al gruppo la domanda sul perche' rimanessero 
appese le istanze access, so che puo' dipendere da recordset non chiusi (o 
altro?)
 
Ho controllato e ricontrollato, ma tutti i recordset vengono chiusi e la 
variabile dell'oggetto RS  impostata sempre a 'Nothing', ho verificato 
attraverso il debug dei moduli VBA senza riscontrare problemi, inoltre l'mdb 
indiziato principalmente a questo problema non e' neanche troppo voluminoso 
(anche se so che non vuol dire...)
 
Che altre prove mi suggerisci di fare?
In ogi caso, nel frattempo, ho provato la routine che mi hai postato, 
associandola all'evento di uscita dal mio menu.mdb: in effetti, in questo 
modo tutte le istanze aperte al momento vengono killate...
 
 
 
 
 
 
 
 
 
 
 

Sicuramente hai degli errori che generano questo problema... ma non è che hai un MDB in rete e lo fai aprire come applicativo..?
Cioè non stai usando una struttura Cliente Server..? 
 
Dal PC in cui risiede il server(solo le tabelle con i dati) NON PUOI VEDERE ALCUNA ISTANZA... quindi quello che dici se sviluppato in modo coerente è impossibile... ma se hai fatto quanto descritto sopra ... ovviamente è sbagliato.
 
@ALEX

 ha scritto nel messaggio 
news:753b175d-d9b6-4f35...@googlegroups.com...

No No Alex,
le tab. sono collegate ad un db MySQL via odbc su un server remoto.
Gli mdb si trovano solo sulla postazione di lavoro...
 
Quindi se dipendesse da errori sul mio mdb, potrei provare ad eliminare il 
recupero dell'errore (tutti gli eventi On Error) e nel caso, una volta 
risolto, potrebbe essere quella la caua dell'istanza bloccata.
E' un tentativo che mi suggerisci di fare?