hPrevInstance

lindin

Erfahrenes Mitglied
Stimmt es, daß "hPrevInstance" bei einer win32-Anwendung immer NULL ist?

Ich wollte mithilfe dieser VAriablen herausfinden, ob mein Programm schon einmal gestartet wurde!
 
Ist es.

Du kannst aber zum Beispiel mit einem Mutex herausfinden, ob dein Programm schon gestartet wurde.

Rufe CreateMutex mit einem eindeutigen Namen auf. Wenn es schon da ist (GetLastError gibt ERROR_ALREADY_EXISTS) dann läuft dein Programm schon.

WICHTIG: Beim Beenden deines Programmes natürlich ReleaseMutex aufrufen.
 
So, jetzt bin ich endlich mal dazu gekommen, das auszuprobieren, und es funktioniert leider nicht...

hier mein Code:
Code:
if((mutexhandle=CreateMutex(NULL,TRUE,"testmutex"))==NULL){
		 dw=GetLastError();
		 sprintf(zwischen,"Error: %d",dw);
		 MessageBox(NULL,zwischen,NULL,MB_OK);
	 }

Wenn ich nun ein zweites mal mal das Programm starte müsste doch eigentlich der Fehlercode in der MessageBox ausgegeben werden, es kommt jedoch gar nichts!
 
vielleicht versuchst du es mal so:
Code:
mutexhandle=CreateMutex(NULL, TRUE, "testmutex");
if(NULL==mutexhandle)
{
 //.. mach was
}
 
Vorsicht: Bei CreateMutex bekommst du das HANDLE auch gesetzt, wenn es schon da ist! Du bekommst aber zusätzlich über GetLastError raus, ob es vorher schon da war:

Code:
  m_hMutex = CreateMutex( NULL, TRUE, "Sesambrötchen" );
  if ( m_hMutex )
  {
    if ( GetLastError() == ERROR_ALREADY_EXISTS )
    {
      AfxMessageBox( "Der ecMaster ist bereits gestartet.\nBeenden Sie gegebenenfalls den bereits laufenden ecMaster." );
      CloseHandle( m_hMutex );
      return FALSE;
    }
  }

Und zum wieder-rauswerfen:

Code:
  if ( m_hMutex )
  {
    ReleaseMutex( m_hMutex );
    CloseHandle( m_hMutex );
    m_hMutex = NULL;
  }
 
Danke, hatte das in der msdn-Hilfe falsch verstanden mit dem Rückgabewert bei einer schon existierenden mutexvariablen!
 
Jetzt wollte ich aber das in diesem Falle schon vorhandene Fenster mit FindWindow suchen!

Ich habe es folgendermaßen versucht:
Code:
if ( mutexhandle ){
          if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
	MessageBox(NULL,"läuft schon",NULL,MB_OK);
                     mutex=TRUE;
	CloseHandle( mutexhandle );
	return FALSE;
    }

Und dann am Schluß:

Code:
case WM_DESTROY :
	if(mutex){
	         MessageBox(NULL,"test",NULL,MB_OK);
	         hwndexit=FindWindow(NULL,"Questico IM");
	         ShowWindow(hwndexit,SW_SHOWMAXIMIZED);
	}
	if ( mutexhandle ){
	         ReleaseMutex( mutexhandle );
	         CloseHandle( mutexhandle );
	          mutexhandle = NULL;
	}
		
         PostQuitMessage (0) ;
         return 0 ;


Aber die MessagBox am Schluß kommt nie, ich weiß nicht, an welcher Stelle ich das machen muß!
Die erste MessageBox kommt, und dann wird mutex auf TRUE gesetzt!
DAnn müßte doch am Schluß wenigstens die MessageBox kommen
 
Eine Idee:

Ist das mutex denn eine globale Variable oder ist die in der WindowProc lokal definiert?

Noch eine Idee:

Der erste Ausschnitt, steht der eventuell in WM_CREATE?
Bin mir nicht sicher, ob ein abgebrochenes WM_CREATE überhaupt ein WM_DESTROY sendet. Versuche doch mal WM_NCDESTROY (die absolut allerletzte Message an ein Fenster).
Ansonsten prüfe mal, ob WM_DESTROY generell überhaupt gesendet wird.
 
Also der erste Ausschnitt steht in WinMain, nachdem ich die Fensterklasse registriert habe, und mit CreateWindow die WindowProzedur aufrufe!

Das Fenster allerdings wird nie angezeigt, ich benutze die Prozedur nur, um ein anders Fenster mit einem Thread zu starten!

Das ganze läft jetzt so ab, daß beim zweiten Start (Programm läuft schon einmal) trotzdem die WM_CREATE-Funktionen ausgeführt werden, also wird WM_CREATE ausgeführt!

Vielleicht sollte ich das ganze vor createwindow machen!
 

Neue Beiträge

Zurück