Mutex, DLL Problem



  • Hallo Leute,

    ich hab mal hier aus dem Forum den Tip bekommen wie man prüft, ob eine dll schon geladen ist, so dass sie bei einem zweiten Programm nicht geladen wird.
    Hab es dann wie folgt gemacht, doch meinProblem ist, dass ich den Ursprungszustand während der Laufzeit wiederherstellen muss, also das dieser Mutex wieder gelöscht wird.

    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    
    	HRESULT nRet       = S_OK;
    	char*   sMutexName = "MUTEXIDENTIFIER"; 
    	DWORD   dwError    = 0; 
    
    	CreateMutex(NULL, true, sMutexName); 
    
    	dwError = GetLastError(); 
    
    	if(ERROR_ALREADY_EXISTS == dwError)	// application is already running 
    	{
    		nRet  = DLL_IS_RUNNING;
    		*pVal = FALSE;
    	}
    	else
    	{
    		*pVal = TRUE;
    	}
    

    Könnt ihr mir helfen?

    Gruß,
    Stalin



  • Hi,

    mit ReleaseMutex kannst du ein Mutex wieder "löschen".

    BOOL ReleaseMutex(
      HANDLE hMutex   // handle to mutex object
    );
    

    Grüße Rapha



  • Das funktioniert aber irgendwie nicht. Er denkt immer noch das der Mutex existert bzw. der Mutex existeriert weiter.
    Weiß jetzt nicht mehr weiter.



  • ReleaseMutex gibt nur den (z.B. mi WaitForSingleObject aquirierten) Mutex wieder frei. Den Mutex löschen mit CloseHandle.

    und:
    InitialOwner sollte man nur bei unbenannten Mutices verwenden

    hm = CreateMutex(NULL, false, name);
    if (!hm) { ... }
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    { 
      Mutex 
    }
    
    WaitForSingleObject(hm);  //< brauchsat du wahrscheinlich nichtmal...
    

    und irgendwann spätestens in DllMain(PROCESS_DETACH) den Mutex mit CloseHandle schließen.


Anmelden zum Antworten