Macro Funktion macht Probleme...



  • Hallo,

    ich beschäftige mich schon seit einigen Wochen mit dem Thema C++ Programmierung.
    Jetzt bin ich auf ein Problem gestoßen, wo ich einfach nicht mehr weiter komme 😞

    stdafx.h

    #pragma once
    
    #include <windows.h>
    #include <string>
    #include <iostream>
    #include <ostream>
    #include <fstream>
    #include <cstdlib>
    
    #include "Logger.h"
    #include "modul.h"
    
    using namespace std;
    

    Logger.h

    #ifndef INCLUDED_LOG_H
    #define INCLUDED_LOG_H
    #ifdef _WIN32
    	#pragma once
    #endif
    
    class Logger 
    {
    	public:
    		Logger(const char *logfile);
    		~Logger(void);
    
    		void log (const char *formatstring, ...);
    	private:
    		FILE *m_fpFile;
    };
    
    // Global Instance...
    static Logger s_gLogging("log_app.log");
    
    // Helper Macro...
    #define DbgLog(formatstring, ...) s_gLogging.log(formatstring, __VA_ARGS__)
    
    #endif
    

    Logger.cpp

    #include "stdafx.h"
    #include "Logger.h"
    #include <time.h>
    
    Logger::Logger(const char * logfile) {
    	m_fpFile = NULL;
    	fopen_s(&m_fpFile, logfile, "a+");
    }
    
    Logger::~Logger(void) {
    	if(m_fpFile)
    	{
    		this->log("-> %s", "File Close");
    		fclose(m_fpFile);
    	}
    }
    
    void Logger::log (const char * formatstring, ...) {
    	SYSTEMTIME sysTime;
    	GetSystemTime(&sysTime);
    	char dateBuffer[4096];
    
    	if(!m_fpFile)
    		return;
    
    	sprintf_s( dateBuffer, "[%04u.%02u.%02u - %02u:%02u:%02u.%03u]\t", 
    			sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds );
    	fwrite(dateBuffer, strlen(dateBuffer), 1, m_fpFile);
    	int nSize = 0;
    	char buff[4096];
    	memset(buff, 0, sizeof(buff));
    	va_list args;
    	va_start(args, formatstring);
    	nSize = vsnprintf_s( buff, sizeof(buff), _TRUNCATE, formatstring, args);
    	sprintf_s( dateBuffer, "nSize: %d, buff: %s\n", nSize, buff);
    
    	fwrite(dateBuffer, strlen(dateBuffer), 1, m_fpFile);
    
    	fflush(m_fpFile);
    
    }
    

    modul.h

    extern int n;
    
    void g();
    

    modul.cpp

    #include "stdafx.h"
    int n = 0;
    
    void g()
    {
    	DbgLog("-> %s", "die Funkiton g() wurde aufgerufen!");
    	n = 42;
    }
    

    log_app.cpp main

    #include "targetver.h"
    #include "stdafx.h"
    
    #include "resource.h"
    
    const char g_szClassName[] = "myWindowClass";
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    	switch(Message)
    	{
    		case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case ID_FILE_EXIT:
    					PostMessage(hwnd, WM_CLOSE, 0, 0);
    				break;
    				case ID_LOG_ADD:
    					DbgLog("-> %s", "add log...");
    				break;
    			}
    		break;
    		case WM_CREATE:
    			DbgLog("-> %s", "App start...");	
            break;
    		case WM_CLOSE:
    			DestroyWindow(hwnd);
    		break;
    		case WM_DESTROY:
    			PostQuitMessage(0);
    		break;
    		default:
    			return DefWindowProc(hwnd, Message, wParam, lParam);
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	WNDCLASSEX wc;
    	HWND hwnd;
    	MSG Msg;
    
    	wc.cbSize		 = sizeof(WNDCLASSEX);
    	wc.style		 = 0;
    	wc.lpfnWndProc	 = WndProc;
    	wc.cbClsExtra	 = 0;
    	wc.cbWndExtra	 = 0;
    	wc.hInstance	 = hInstance;
    	wc.hIcon		 = LoadIcon(hInstance, MAKEINTRESOURCE(DLG_ICON));
    	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
    	wc.lpszClassName = g_szClassName;
    	wc.hIconSm		 = LoadIcon(hInstance, MAKEINTRESOURCE(DLG_ICON));
    
    	if(!RegisterClassEx(&wc))
    	{
    		MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
    		return 0;
    	}
    
    	hwnd = CreateWindowEx(
    		WS_EX_CLIENTEDGE,
    		g_szClassName,
    		"Log App",
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
    		NULL, NULL, hInstance, NULL);
    
    	if(hwnd == NULL)
    	{
    		MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
    		return 0;
    	}
    
    	DbgLog("n vor func g() = %d", n);
    	g();
    	DbgLog("n mit func g() = %d", n);
    
    	ShowWindow(hwnd, nCmdShow);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&Msg, NULL, 0, 0) > 0)
    	{
    		TranslateMessage(&Msg);
    		DispatchMessage(&Msg);
    	}
    
    	return Msg.wParam;
    }
    

    In der log_app.cpp funktioniert die DbgLog Macro Funktion ohne Probleme, aber in der modul.cpp dagegen überhaupt nicht 😕

    Habe nun schon mehre Stunden rumprobiert, jedoch ohne Erfolg. Würde mich sehr freuen wenn mir jemand helfen könnte 🙂

    MfG OloX



  • und wie genau äußert sich dieses "funktioniert nicht"? Gibt es Compiler-Fehler (welche)? Lässt sich das Programm starten und mact nicht das erwartete?



  • Ich vermute, im Header die
    static Logger s_gLogging("log_app.log");
    ist schlecht.
    Besser im Header nur
    extern Logger s_gLogging;
    und in der cpp-Datei
    Logger s_gLogging("log_app.log");

    Meine Vermutung: Die Datei war zweimal geöffnet und beine Logger haben in die selbe Datei geschrieben und der spätere hat einfach verloren.



  • @CStoll
    in der modul.cpp wird in der Funktion g() die DbgLog Funktion aufgerufen, die dann ein Log Eintrag tätigt. Aber in der Log Datei steht nix von "die Funkiton g() wurde aufgerufen!" 😞
    In der log_app.cpp (Hauptdatei) wird dagegen jeder Eintrag sauber erledigt.



  • Hast du es mal mit 'nem Debugger probiert? Ansonsten schließe ich mich mal volkards Vermutung an - entweder die Aktionen des zweiten Loggers sind überschrieben worden oder sein fopen()-Aufruf ist bereits schiefgelaufen.



  • Mit einem Debugger habe ich es noch nicht probiert (keine erfahrung damit).
    Hier der komplette Source Code ...



  • OloX schrieb:

    Mit einem Debugger habe ich es noch nicht probiert (keine erfahrung damit).
    Hier der komplette Source Code ...

    Wenn Du meine Änderungen anbringst, klappt's dann?

    Logger s_gLogging("log_app.log");
    

    in die Logger.cpp
    und
    statt

    static Logger s_gLogging("log_app.log");
    

    jetzt

    extern Logger s_gLogging;
    

    in der Logger.h



  • Vielen dank volkard 👍
    Jetzt funktioniert es perfekt 🤡


Anmelden zum Antworten