[Gelöst] SetThreadErrorMode via GetProcAddress aufruen



  • Hallo,

    ich habe folgende Klasse:

    ErrorMode::ErrorMode() : m_errorMode(0), m_SetThreadErrorMode(0) {
    	const UINT newMode = SEM_FAILCRITICALERRORS;
    
    	HINSTANCE dllHandle = LoadLibrary("kernel32");
    	if (dllHandle) {
    		m_SetThreadErrorMode = SET_THREAD_ERROR_MODE(GetProcAddress(dllHandle, "SetThreadErrorMode"));
    		if (m_SetThreadErrorMode) {
    			if (!m_SetThreadErrorMode(newMode, &m_errorMode)) {
    				m_SetThreadErrorMode = nullptr;
    			}
    		}
    	}
    
    	if (!m_SetThreadErrorMode) {
    		m_errorMode = SetErrorMode(newMode);
    	}
    }
    
    ErrorMode::~ErrorMode() {
    	if (m_SetThreadErrorMode) {
    		m_SetThreadErrorMode(m_errorMode, &m_errorMode);
    	}
    	else {
    		SetErrorMode(m_errorMode);
    	}
    }
    

    Unter 64-Bit Windows als 64-Bit Anwendung tut diese Klasse, was sie tun soll. Als 32-Bit Anwendung hagelt es aber ständig Abstürze. Dummerweise aber nicht hier sondern an andere Stelle beim Kopieren eines std::vector<std::string>.

    Das Seltsame ist, wenn ich die Funktion direkt aufrufe also statt

    if (!m_SetThreadErrorMode(newMode, &m_errorMode)) {
    

    Dieses hier verwende.

    			if (!SetThreadErrorMode(newMode, &m_errorMode)) {
    

    funktioniert es auch als 32-Bit Anwendung. Nur lädt die Anwendung dann nicht unter älteren Dosen.

    Hat jemand eine Idee wo ich suchen kann?

    LG Martin



  • Vielen Dank, an alle, die sich Gedanken gemacht haben. Habe wohl die Lösung gefunden. Der Fehler steckte nicht in dem Code-teil, den ich gepostet hatte, sondern hier:

    typedef BOOL(*SET_THREAD_ERROR_MODE)(DWORD dwNewMode, LPDWORD lpOldMode);
    

    so hätte es gehört:

    typedef BOOL(WINAPI *SET_THREAD_ERROR_MODE)(DWORD dwNewMode, LPDWORD lpOldMode);
    

    Das sind so Scheißfehler, wo man lange sucht.


Log in to reply