error C3861: 'CreateMutex': identifier not found



  • Hallo zusammen,

    ich habe eine neue Dialog Applikation mit der Template MFC Applikation erstellt.

    Dann habe ich wie üblich in InitInstance mehrfach Startlock eingebaut:

    BOOL CScriptExec_H11::InitInstance ()
    {
    	// Diese Applikation darf nur einmal gestartet werden!
    	mThisApp = CreateMutex (NULL, TRUE, _T("ScriptExec_H11"));
    	if (GetLastError () == ERROR_ALREADY_EXISTS)
    	{
    		ENSURE (mThisApp != NULL);
    		CloseHandle (mThisApp);
    		mThisApp = NULL;
    		return FALSE;
    	}
    
    ...
    }
    

    Jetzt kommt beim kompilieren der Fehler:
    1>r:\mclib\examples\scriptexec_h11\scriptexec_h11.cpp(68): error C3861: 'CreateMutex': identifier not found

    Ich habe dann eine andere (normale, nicht Dialog) MFC Applikation geöffnet. Da steht exakt der gleiche Code in InitInstance. Diese Applikation kann ich aber problemlos kompilieren.

    Ich habe die stdafx.h und die Properties der beiden Applikationen verglichen und keinen Unterschied gefunden. Also ich verstehe nicht, warum der in dieser Applikation den CreateMutex nicht findet.

    Wenn ich in der neuen Dialog Applikation diesen Code einfüge, dann kompiliert das Dingens ohne Fehler.

    BOOL CScriptExec_H11::InitInstance ()
    {
    	// Diese Applikation darf nur einmal gestartet werden!
    	mThisApp = CreateMutexEx (NULL, _T("ScriptExec_H11"), 0, 0);
    	if (GetLastError () == ERROR_ALREADY_EXISTS)
    	{
    		ENSURE (mThisApp != NULL);
    		CloseHandle (mThisApp);
    		mThisApp = NULL;
    		return FALSE;
    	}
    
    ...
    }
    

    Eigentlich kann ich mit CreateMutexEx auch leben 🕶
    Aber ich habe die Erfahrung gemacht, dass wenn man etwas nicht versteht es einem früher oder später um die Ohren fliegt.

    Woran kann es liegen, dass er die CreateMutex Funktion nicht findet?


  • Mod

    Also CreateMutex gibt es so nicht. Das ist nur ein Define.
    Es gibt real als Funktionen nur CreateMutexA und CreateMutexW.
    Der define verweist je nach Compiler Einstellungen eben auf CreateMutexA oder CreateMutexW.
    Wenn nun ein #undef CreateMutex gemacht wird, kann Dein Fehler die Folge sein.

    Es gibt Bibliotheken die solche undefs auf Windows Indentifiert machen.
    Was für Libs verwendest Du.



  • Also CreateMutex gibt es so nicht. Das ist nur ein Define.

    Das ist mir bekannt 😉 Bei mir sollte er CreateMutexW einsetzen.

    Wenn nun ein #undef CreateMutex gemacht wird, kann Dein Fehler die Folge sein.

    #undef ist das Stichwort welches mir gefehlt hat.

    Ich habe in der Zwischenzeit noch einen Versuch gemacht und nochmals eine Dialog Applikation erstellt.
    Nur diesmal habe ich die Bildverarbeitungs Bibliothek (BVLib) nicht mit eingebunden.

    Jetzt findet er CreateMutex!

    Dann mal den Header der BVLib geöffnet... und siehe da.

    // Resolve known macro collisions
    #if defined(_WIN32)
    
    #undef FindText
    #undef CreateMutex
    #undef CreateEvent
    #undef DeleteFile
    
    #endif
    

    Ist das nicht ein Murks?

    Vor allem wenn dann CreateMutex wie folgt definiert wird.

    virtual void CreateMutex(const BVLib::String &AttribName, const BVLib::Type &AttribValue);
      void CreateMutex(const BVLib::Type & AttribName, const BVLib::Type & AttribValue);
      void CreateMutex(const BVLib::String & AttribName, const BVLib::String & AttribValue);
      void CreateMutex(const char* AttribName, const char* AttribValue);
    

Anmelden zum Antworten