Newsgroup: it.comp.appl.access
Titolo: UCCIDERE a TUTTI I COSTI una applicazione Access da un' altra applicazione Access

Essendo dentro l' MDB A, col VBA faccio :
dim Acc as access.application
Acc.opencurrentdb("c:\ ...\mio.mdb")
E questo sia B.
Poi sempre da A faccio in modo che
B esegua una funzione abbastanza complessa.
Ad un certo momento da A devo a tutti i costi
ammazzare la B, chiuderla. In ogni caso e
cascasse il mondo.
Ma quella si impadronisce del controllo e non
lo cede. Se faccio App.quit non mi si fila.
NON e' un errore di programma, e' che si mette
in attesa di un evento esterno e non si schioda
nemmeno a fucilate se questo evento non accade.
Ma io la DEVO ammazzare ! Come faccio ?


Già è un grosso problema... un problemone...
@Alex


non puoi mettere un tempo di attesa max a "questo evento esterno" ?
ciao
BFS

"@Alex"  ha scritto nel messaggio 
news:aa7f2274-4680-44ee...@v11g2000prb.googlegroups.com...


@Alex
____________Risposta:
Sì @Alex, non si trovano più i killer di una volta..
L'ultimo ha fatto una brutta fine...
http://www.youtube.com/watch?v=KZ3efsgJo28
MA 


Hai provato ad usare taskkill.exe per interrompere il programa indesiderato 
?
http://www.computerhope.com/taskkill.htm
Ciao
RobertoA


Eh no ...


Il problema e' che :
come so il nome del task da uccidere ?


Ma vaffanculo vai.


Cioe' voglio dire :
e' una applicazione vba che gira dentro un mdb access !
Se ammazzo l' access.exe, potrei ammazzare l' applicazione
killer invece di quella giusta : suicidio praticamente. :-))

 killer invece di quella giusta : suicidio praticamente. :-))
Questo accade perchè tecnicamente non sai nemmeno di cosa parli... la
cosa è di una banalità elementare.
Come sono lieto... di tutto ciò.
P.S. sono andato dove mi suggerivi prima ed ho provato un'estremo
piacere... ma non solo... ho trovato proprio li la soluzione per il
tuo problema...!
Ora se pensi possa servirti.. sai dove trovarla... senza che ti ci
indirizzi io... è SELF-SERVICE.
E questa è sempre Classe... caro il mio "Cogl...zzo"...
@Alex


fammi indovinare...fantozzi a biliardo con il 
mega-direttore-intergalattico-gran-figl-di-putt-catellani?
BFS


Ottima memoria...!
@Alex

 killer invece di quella giusta : suicidio praticamente. :-))
Lanci l'applicazione killer (la A)
Leggi il pid di tutte le applicazioni msaccess.exe
Dalla A lanci l'applicazione B
Dalla A leggi il pid di tutte le applicazioni msaccess.exe, quelle in piu' 
della lettura precedenti probabilmente sono dovute alla B e quindi quando 
vuoi, dalla A potrai accoppare quelle che vuoi
Sarebbe interessante provare se riesci dalla A a taskillare la A stessa, se 
ci provi facci sapere, anzi provaci e faccelo sapere
Ciao
RobertoA

 RobertoA
Siamo molto fuori strada... il PID intanto lo leggi solo scorrendo
tutti i Thread, ma non sei in grado di capire quale ProcessID
appartiene
al tuo da uccidere avendo aperto l'istanza via OLE... quindi senza PID
relativo.
Facciamo le cose semplici semplici che funzionano bene... non
cerchiamo cose assurde.
@Alex

"radicale 004"  ha scritto nel messaggio 
news:cd6aa535-4056-4451...@x13g2000vbe.googlegroups.com...
Cioe' voglio dire :
e' una applicazione vba che gira dentro un mdb access !
_________________Risposta:
Chi l'ha detto che una notazione tecnica non può essere poesia???
Tu hai un'applicazione VBA... .... ...
che gira in un MDB.... ... ...
Mi emoziono sempre quando vedo competenza in quel che si dice.
p.s. giusto docendi causa, e un'applicazione VBA FUORI un mdb o un xls come 
funziona?
MA

 cerchiamo cose assurde.
Dato che di secondo nome faccio "Assurdo" (il terzo e' "Pazzesco",
mentre il quarto e' "Folle"), ti dico cosa uso per far suicidare le
mie applicazioni XP se qualcosa resta appeso (la formattazione
condizionale ... 'zzarola!!!).
Nel processo chiamato ho piazzato una funzione pubblica che mi ritorna
il pid tramite syscmd (1), e se il chiamante vede che qualcosa non va
gli dico di tirare il grilletto (2).
Troppo complicato? Poco pulito? HoVintoQualcheCosa? :)
Popi
(1) SysCmd(609) - GET PROCESS ID OF CURRENT INSTANCE - MSACCESS.EXE -
Access 2000+ only
Returns the PID (Process ID) of the currently running MSAccess.exe
process.  This would come in very handy for some Windows API calls...
 (2) Shell "CMD.EXE /C TASKKILL /PID " & TaskToKill & " /F /T", vbHide


Andate piano...
Basta 1 riga di codice per fare questa cosa senza fare voli pindarici
strani... vi state perdendo in un bicchiere d'acqua....
Il problema è che non do la soluzione nemmeno se mi inchidano alla
croce...!!! ;-)
In PVT posso anche dirvela... ma solo a pochi...!
@Alex


hai provato con:
acc.closecurrentdatabase
-- 
Ciao
Geppo


No, perchè effettivamente l'istanza OLE non risponde...!
1 Riga di codice solo ma non via OLE...!
@Alex

 1 Riga di codice solo ma non via OLE...!
DDE? Chi offre di piu'? :D
Popi


No.
@Alex

 Popi
No.
-----------------------
Spegnere il picci ?

 ha scritto nel messaggio 
news:612a6180-c8f9-49dc...@a26g2000vbo.googlegroups.com...



via RET-tale? *_*
Shell?....Api? ... Q8? :DD
ciao
Daniele 

 Daniele
Q8 è il distributore di benzina... per dare fuoco a tutto...?
Non la dico la soluzione... altrimenti l'ometto del Biliardo impara...
e sai che io sono Radicale nelle decisioni, ma a te in privato la
spiego...! ;-)
@Alex

 Daniele
Q8 č il distributore di benzina... per dare fuoco a tutto...?
Non la dico la soluzione... altrimenti l'ometto del Biliardo impara...
e sai che io sono Radicale nelle decisioni, ma a te in privato la
spiego...! ;-)
@Alex
-------------------------------------------
Mi 'so perso qualcosa, chi e' l'ometto del Biliardo ?

"@Alex"  ha scritto nel messaggio 
news:ee2eba9c-6781-46cf...@y14g2000vbb.googlegroups.com...


___
Anche Shell e API.
Ah Caro Buon Vecchio CIDI, solo uno scemo come me le capisce a volo le 
scemate...
MA

 Mi 'so perso qualcosa, chi e' l'ometto del Biliardo ?
Leggi il 3D di BSF del 8 Mar, 18:49
;-)
@Alex

 ha scritto nel messaggio 
news:ca2f4f9d-cbd7-4e87...@v11g2000prb.googlegroups.com...

secondo me stavolta ti sbagli..........
non impara non ti preoccupare..., altrimenti non continuerebbe con questo 
atteggiamento..
p.s. io condivido la tua scelta tu sei il padrone delle tue informazioni 
sei libero di condividerle o meno, giusto per far presente che qui nulla č 
dovuto e se qualcuno si presta ad aiutare gli altri c'č solo da 
ringraziarlo.
ciao
Max 

 Max
No no ... non è così... io in 15 anni non ho mai rifiutato
informazioni a nessuno, nemmeno quando si discuteva animatamente... e
bada che ho detto discuteva.
Non mi sono mai permesso si insultare gratuitamente o di mandare
affan...culo nessuno... si deve ricordare che non si va mai sul
personale, la discussione
è e deve rimanere tecnica, la dove supera questi concetti... va male.
In questo caso la scelta è proprio per dispetto... giusto o meno che
sia..., ho detto pure che ad altri in privato posso pure dirlo..., e
magari la dirò anche
a lui quando uscirà con una Soluzione da 150 righe di codice con 100
dichiarazioni API .... allora infierirò ulteriormente...!
Perchè io sono BASTARD_INSIDE, ed alcune volte anche OUTSIDE
@Alex

 Perchè io sono BASTARD_INSIDE, ed alcune volte anche OUTSIDE
No, se fossi veramente bastardo l'avresti indirizzato su IDL ... :)
Se, invece, fossi stato kattivo & bastardo gli avresti fatto togliere
la connessione.
**************MUMBLE**************
Hai mica voglia di diventare anche kattivokattivokattivo? ;D
Popi


Il birillo?
Ciao, Carlo 

 Come sono lieto... di tutto ciò.
(omissis)
Sei uno squilibrato : non c'e' altra spiegazione al tuo
comportamento.
Comunque ho risolto, grazie.

 funziona?
Inutile cercare di spiegartelo : non capiresti.
Ho visto l' altra volta, con te e' come parlare al muro.

 ci provi facci sapere, anzi provaci e faccelo sapere
Piu' o meno ... :-)
dim G_ACCESS   as access.application
Set G_ACCESS = CreateObject("access.application")
G_ACCESS.OpenCurrentDatabase "c:\ ... mdb", False
G_H_PROC = G_ACCESS.Application.hWndAccessApp
Il G_H_PROC puoi usarlo per uccidere l' applicazione
G_ACCESS tramite qualche API

 funziona?
Inutile cercare di spiegartelo : non capiresti.
_____________________Risposta:
Certo, anche perchè dovresti capirlo prima tu... è molto facile ogni volta 
dire "Tu non capisci"
credendo di superare il problema.
La verità è che io circostanzio le mie affermazioni sul fatto che TU non 
conosci ciò di cui straparli
e alle eccezioni o mandi quel paese o dici che non capiamo...
Ho visto l' altra volta, con te e' come parlare al muro.
_____________________Risposta:
Io non dico invece che deja vu torna quando parlo con te
MA


10gg per arrivare a questo...????
L'ho inviata come soluzione ormai da almeno 4gg a 5 persone... ;-)
Usa PostMessage invece di qualche API... ne basta 1 usata bene...,
ovviamente sai già la differenza tra SendMessage e PostMessage... che
te lo dico a fare.... caro il mio "Cog....zzo"
@Alex

 ovviamente sai già la differenza tra SendMessage e PostMessage...
Certo che la so, la prima e' sincrona la seconda e' asincrona.
E credo di aver capito cosa intendi.
Vedi ... Il fatto e' che (colpa mia) non ho spiegato BENE nei
particolari quello che sto facendo.
Il problema deriva dal fatto che il DB2 IBM, nella installazione
che abbiamo da noi, pare non supporti il timeout dell' oggetto
command. Non c'e' verso. Sentiti anche i sistemisti : non
funziona.
Ora, sto sviluppando (tra le altre cose) un sistema siffatto :
gli utenti mandano via email le query piu' disparate ad una
macchina (pc) centrale, la quale usando il driver OLE DB
dell' IBM si connette al DB2, la esegue, produce un report e
lo spedisce al mittente.
Ma come tu mi insegni gli utenti sono pazzi, e potrebbero
spedire queries che richiedono MILIARDI di record o
sono ESTREMAMENTE complesse (per quanto concerne
gli errori sintattici, quelli li intercetto e gli rispondo, no
problem) o ambedue le cose.
Una query siffatta bloccherebbe il sistema anche per
un' ora, o piu' , il che gli impedirebbe di soddisfare le altre
richieste.
La soluzione piu' semplice che avevo ideato e' offerta dalla
copia timeout/recordset asincrono.
Col timeout gestisco l' attesa dal main frame, e con l' evento
fetchprogress del recorset (superato il timeout) conto i record
in arrivo. Se superano una certa soglia, butto fuori l' utente previa
notifica.
Purtroppo, il time out non funziona. Ed a quel punto e' inutile anche
l' asincronicita' del recordset, perche' i dati potrebbero cominciare
ad arrivare chissa' quando. Mi spiego ?
Sintetizzando all' inverosimile :
Allora debbo fare cosi (l' ho gia' quasi fatto, e pare funzioni) :
Produco DUE applicazioni indipendenti, un governor (G) ed un
processor (P). Il governor e' sempre in RAM, pronto ad ascoltare
le richieste (la macchina e' dedicata).
Quando arriva una richiesta G "accende" P e gliela passa, poi
si mette in attesa. Ogni tot tempo controlla P, e se viene superato
il tempo limite, lo uccide.
Ma attenzione ! P puo' essere acceso da G, ma la procedura
(in P) che si connette al DB2 e scarica i dati NON PUO' essere
chiamata da G, perche' in quel caso il blocco di P coinvolge
anche il G. Per ovvi motivi.
Occorre invece che P sia anch' esso dotato di un timer (che
si attiva all' apertura), che con una chiamata in call back scatena
(dopo diciamo 5 secondi dall' attivazione di P) autonomamente e
senza l' intervento di G la procedura che carica i dati.
Ora tu dici :
se la G, dopo aver attivato P, manda un postmessage con un
delay uguale al tempo limite, si otterrebbe lo stesso risultato
senza  bisogno che la G controlli ogni tot se il tempo limite
e' stato superato.
Ma in quel caso, la G come sa' che la P e' stata uccisa, e quindi
come fa a sapere che deve avvertire l' utente ?
Non saprei ... Non c' ho ancora pensato.
Ed inoltre francamente non ho dimestichezza con la postmessage
(la conosco, ma avere dimestichezza e' ALTRA cosa).
Che ne pensi, cosa mi consigli ?

 Mi sa che come al solito ti arrampichi sugli specchi...
Cos'e' che non capisci, che non ti "aggrada" ?
Cosa ci trovi di cosi' assurdo nel fatto che io scrivo
VBA a gogo'  DENTRO l' Access ?


Parlando seriamente, non è facile suggerire soluzioni a queste
problematiche, sarebbe troppo banale ridurre il problema.
Personalmente ho sperimentato l'uso sei WebServices per gestire molte
di queste opzioni.
Sostanzialmente cosa sono i WebServices, sono dei servizzi sviluppati
in qualsiasi linguaggio(non VBA) NET consente di strutturarli bene...!
Di fatto sono dei Driver di interfaccia tra un CLIENT ed un SERVER che
consentono all'utente di estrarre dati dal Server.
Come gestire l'estrazione e quant'altro è a carico del WebService e
non del Server.
Non so se questa soluzione può risolvere il tuo problema, ma sono
molto flessibli e potenti se strutturati in modo adatto, spesso chi li
fa è chi sviluppa anche
le utenze Client-Side... quindi li customizza.
Nella mia azienda ad esempio abbiamo un Server SQL su una rete DMZ, i
dati sul Server devono essere accessibili dalla rete internet, ed io
che sono l'amministratore
di rete non apro nessuna porta oltre la 80(Http).
Quindi un mio collega, molto più esperto di me in questo campo, ha
realizzato un WS che gira nel Server al quale io via Http invio le
queries, lui le traduce in queries da applicare con 
ADO.NET
 a SQL-
SERVER e mi restiuisce un Set di dati... risultato della Querry.
Siccome il WS gira in Locale con NET può gestire TimeOut e tutto
quello che serve.
Ciao
@Alex

 quello che serve.
Mi sembra un notevole passo avanti, ma purtroppo dove lavoro io
cose di questo genere vengono affidate a ditte esterne (per ragioni
politiche ... Sai com' e')  per cui dovrei fare *tutto* da solo, e
capisci
che se poi si sfascia qualcosa (a parte che mi ci vorrebbe qualche
mese per impadronirmi BENE della tecnologia !) nessuno saprebbe
metterci le mani. Oddio ... Nemmeno su quello che faccio adesso in
realta', ma insomma, un po' di piu' (diciamo).

 realta', ma insomma, un po' di piu' (diciamo).
Beh io non uso tecnologia Net, quindi oltre che spiegarti quello che
ho visto e come lavora non saprei dirti altro.
Nel nostro caso il mio collega è autodidatta, ma è molto preparato...
@Alex

 Nel nostro caso il mio collega è autodidatta, ma è molto preparato...
Non lo metto in dubbio.


Questa è la dichiarazione:
Public Declare Function PostMessage Lib "user32" Alias
"PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam
As Long, lParam As Any) As Long
Const WM_CLOSE = &H10
PostMessage TuohWnd, WM_CLOSE, 0&, 0&
L'uso di PostMessage e SendMessage richiede la conoscenza dei
fondamenti di Windows.
Windows scambia messaggi tra se e gli oggetti istanziati in un solo
modo... usando come Riferimento l'istanza(hWnd o Handle) dell'oggetto
stesso.
Quali siano i Messaggi... sono tutti quelli che Windows usa a seconda
di cosa deve comunicare e con chi(inteso con che oggetto)... sono
tantissimi, complessi e spesso strutturati e raggruppati per
tipologia.
In qualche mio demo che ABUSA di Api, come quelli che ricostruiscono i
Controlli Activex come il TreeView ecc... c'è un Modulo specifico con
tutte le dichiarazioni API ed i Messaggi, fino a qualche anno fà
su queste cose ci passavo notti lunghissime... e moltissimo tempo, ora
non ho più tempo.
Conoscere questo è d'obbligo se si usa il SubClassing ad esempio
perchè se guardi iparametri della Chiamata Post/SendMessage sono
esattamente quelli restituiti dalla WinProc chiamata in CallBack per
subclassare.
Infatti se tu da un'applicativo invii il CLOSE ad una WinForm nel caso
tu avessi Subclassato la WinForm poresti intercettare il comando di
CLOSE ed anche annullarlo...!
Per tutte queste cose è utile ricorrere a SPY++
Fai presente che ogni ObjectType ha il proprio dialetto ed il proprio
modo di ricevere Messaggi... e questo complica molto le cose, ma ci
sono alcuni messaggi espliciti di qualsiasi Oggetto.
Nel tuo caso la gestione del Timer la devi fare a parte, e l'uso di
PostMessage è proprio per evitare di impallare il Client in attesa di
un'esecuzione... conviene distruggere in modo Asincrono, il comando di
CLOSE
si mette in coda ai messaggi che WinProc invia alla WinForm, e lo
esegue appena ne ha la possibilità senza restituirti l'esito.
@Alex

 restituirti l'esito.
... Se ho capito bene tu dici che il governor, dopo che ha chiamato
il processor, manda la post dopo un certo tempo dalla chiamata.
In pratica e' lo stessa tecnica che ho sviluppato io, solo che tu
uccidi il processor con la postmessage, io con un paio di API
che non sono altro che quelle che vengono richiamate quando
l' utente uccide un task dal gestore processi.