Newsgroup: it.comp.lang.visual-basic
Titolo: Come evitare di eseguire un'applicazione già in esecuzione??

Capita spesso che per errore dell'operatore al PC oppure per difetto del
mouse un'applicazione vada in esecuzione su più di un task, provocando a
volte seri problemi. E' possibile, dall'interno di un'applicazione,
verificare che la stessa non sia già in esecuzione, in modo da bloccarla
nel caso in cui questa condizione fosse accertata?
Grazie in anticipo. Raoul

 scritto nell'articolo
<01bc9942$fc3bccc0$Loca...@r.guidotti>...



E' disponibile anche su VB4: quindi basta scrivere
If App.PrevInstance Then End

sicuro che tale proprietà si disponibile in VB4. Certamente lo è in VB5.
Se questa proprierà funziona solo con programmi a 16 bit.
I programmi Win32 la mantengono per compatibilità ma dicono sempre che
questa è la prima istanza.
Ci sono altri modi ma sono più complicati e non li ho ancora usati: ti
consiglio di dare un'occhiata al Knowledge Base del sito Microsoft
oppure al cd di MSDN.
Questa è una documentazione nuda e cruda, cercando nella Knowledge
Base di Visual Basic dovresti trovare di meglio:
--------------------
PSS ID Number: Q124134
Authored 19-Dec-1994			Last modified 21-Feb-1995
The information in this article applies to:
 - Microsoft Win32s, versions 1.1, 1.15, 1.15a, and 1.2
 
SUMMARY
 
The entry point for both Windows-based and Win32-based applications
is:
   int WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
   HINSTANCE hInstance;        /* Handle of current instance  */
   HINSTANCE hPrevInstance;    /* Handle of previous instance */
   LPSTR lpszCmdLine;          /* Address of command line     */
   int nCmdShow;               /* Show state of window        */
You can allow only one instance of your Windows-based application to
run
at a time by using hPrevInstance to determine if there is already an
existing application instance; then exit the process if there is one.
If
there is no previous instance, hPrevInstance is NULL.
However, in a Win32-based application, hPrevInstance is always NULL.
Therefore, you cannot determine if another instance of your
application
has been started simply by examining hPrevInstance. This article gives
you
a method you can use.
 
MORE INFORMATION
 
Use one of the following four methods to determine if there is an
existing
application instance on Win32s:
 - Synchronize with a named object, such as a file mapping.
   -or-
 - Synchronize with a global atom.
   -or-
 - Synchronize with a private message.
   -or-
 - Use FindWindow() to check for the application.
Using a File Mapping
--------------------
Using a file mapping works well on any Win32 platform. The global atom
is a
cheaper resource, whereas a file mapping will cost a page of memory. A
private message is good if you want to inform the first instance that
the
user attempted to start a second instance, and then let it handle the
request -- post a message, become the active application, and so on.
NOTE: You need to clean up before terminating the second instance.
FindWindow() doesn't require cleanup, but this method will not work as
reliably in a preemptive multitasking environment, such as Windows NT,
because you can get in a race condition.
The following code fragment demonstrates how a file mapping can be
used
to allow only one instance of a Win32-based application. This code
should
avoid any race conditions. Place this code at the beginning of
WinMain().
The code creates a file mapping named MyTestMap using
CreateFileMapping().
If MyTestMap already exists, then you know that there is already a
running
instance of this application. A similar technique would be used with a
global atom.
Sample Code
-----------
   HANDLE hMapping;
   hMapping = CreateFileMapping( (HANDLE) 0xffffffff,
                                 NULL,
                                 PAGE_READONLY,
                                 0,
                                 32,
                                 "MyTestMap" );
   if( hMapping )
   {
      if( GetLastError() == ERROR_ALREADY_EXISTS )
      {
      //
      // Display something that tells the user
      // the app is already running.
      //
         MessageBox( NULL, "Application is running.", "Test", MB_OK );
         ExitProcess(1);
      }
   }
   else
   {
   //
   // Some other error; handle error.
   //
      MessageBox( NULL, "Error creating mapping", "Test", MB_OK );
      ExitProcess(1);
   }
Additional reference words: 1.10 1.20
KBCategory: kbprg kbcode
KBSubcategory: W32s
--------------------------------------------------------------------
Fulvio Senore
Eliminate "NOSP" dall'indirizzo e-mail per scrivermi (spammers...)
Remove "NOSP" from e-mail address to write me (spammers...)
--------------------------------------------------------------------

 accedere al CD.
 mese."
Scrivimi in E-Mail: ti mando un listato che tramite un paio di chiamate
al Kernel ti dà l'elenco dei task attivi, uno ad uno...
..cerca quello giusto e vigliaccamente lo termina!


E se invece volessi sapere se un'altra qualsiasi specifica
applicazione sia in esecuzione? E.g. se volessi far partire una
richiesta al CD, ma non e' possibile perche' un altro programma lo sta
facendo, dovrei chiudere quell'applicazione (che diaciamo conosco) e
accedere al CD.
grazie, carlo
Carlo Quartararo
Bari - Italia
mailto: 
noma...@geocities.com
Leggete: 
http://www.geocities.com/SoHo/Lofts/9620
            "Morti già da tempo nel mondo, 
      gli uomini proseguivano senza più ragione 
         a compiere il loro macabro rituale.
         Giorno dopo giorno, mese dopo mese."