Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

chiudere tutte le istante access aperte

593 views
Skip to first unread message

Marco67

unread,
Sep 13, 2016, 10:02:31 AM9/13/16
to
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


@Alex

unread,
Sep 13, 2016, 10:37:39 AM9/13/16
to
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

unread,
Sep 13, 2016, 1:01:39 PM9/13/16
to
"@Alex" <ik2...@libero.it> ha scritto nel messaggio
news:f500abe0-512f-4544...@googlegroups.com...
Il giorno martedě 13 settembre 2016 16:02:31 UTC+2, Marco67 ha scritto:
> 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

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
--


@Alex

unread,
Sep 13, 2016, 7:06:12 PM9/13/16
to
....
> 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

Marco67

unread,
Sep 14, 2016, 11:15:11 AM9/14/16
to
"@Alex" <ik2...@libero.it> 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



@Alex

unread,
Sep 14, 2016, 11:58:57 AM9/14/16
to
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

Marco67

unread,
Sep 14, 2016, 1:06:35 PM9/14/16
to

"@Alex" <ik2...@libero.it> 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...











@Alex

unread,
Sep 14, 2016, 4:33:57 PM9/14/16
to
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

Marco67

unread,
Sep 15, 2016, 3:08:00 AM9/15/16
to
"@Alex" <ik2...@libero.it> 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?



0 new messages