Макрос не выполняет функцию

0

У меня есть макрос, и я использую его так:

int GL = 0;
GL = GetLastError();
DEBUG_MESSAGE( ERR, "RegOpenKeyEx failed. Error code = '%u'. Error description = '%s'", GL, GetErrorText( GL ) );

Функция GetErrorText возвращает char *, который является соответствующим errortext, принадлежащим коду ошибки.

Проблема в том, что когда я вызываю свой макрос, он не будет вызывать функцию GetErrorText. Результат будет таким: RegOpenKeyEx failed. Error code = '5'. Error description = '' RegOpenKeyEx failed. Error code = '5'. Error description = ''

Макро определяется следующим образом:

#define DEBUG_MESSAGE( Type, debug_message, ... ) { _debugLog.message( Type, debug_message, ##__VA_ARGS__ ); }

И это функция, которую вызывает макрос:

void log::message( int Type, const char * message, ... )
    {
        char MessageExpanded[ 2048 ] = { 0 };
        va_list args;
        int len;

        write_indentation();

        memset( Message, 0, sizeof( Message ) );
        memset( MessageExpanded, 0, sizeof( MessageExpanded ) );

        va_start( args, message );

        len = _vscprintf( message, args ) + 1; // _vscprintf doesn't count terminating '\0'

        vsprintf_s( Message, len, message, args );

        va_end( args );

        sprintf( MessageExpanded, "%s %s", Spaces, Message );
        LOG( MessageExpanded, context.c_str(), "", Type, CurrentFileName );

    }//log::message

Есть ли способ решить это как-то?

Заранее спасибо!

Обновить:

char * GetErrorText( DWORD dwLastError )
{
DEBUG_METHOD( INFO );
DEBUG_MESSAGE( INFO, "Argument1 = '%d'", dwLastError );

HMODULE hModule = NULL; // default to system source
LPSTR MessageBuffer;
DWORD dwBufferLength;
char Error[ SMALL ] = { 0 };
char * ErrorMsg = NULL;

DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM;

// If dwLastError is in the network range, load the message source.
if ( dwLastError >= NERR_BASE && dwLastError <= MAX_NERR )
{
    hModule = LoadLibraryEx( TEXT( "netmsg.dll" ), NULL, LOAD_LIBRARY_AS_DATAFILE );
    if ( hModule != NULL ) dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}

// Call FormatMessage() to allow for message text to be acquired from the system or from the supplied module handle.
if ( dwBufferLength = FormatMessageA(
                                      dwFormatFlags,
                                      hModule,                                     // module to get message from (NULL == system)
                                      dwLastError,
                                      MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // default language
                                      ( LPSTR )&MessageBuffer,
                                      0,
                                      NULL
                                    )
    )
{
    memset( Error, 0, sizeof( Error ) );
    //printf( "\n%s", MessageBuffer );
    sprintf( Error, "%s", MessageBuffer );
    ErrorMsg = Error;

    // Free the buffer allocated by the system.
    LocalFree( MessageBuffer );
}

// If we loaded a message source, unload it.
if ( hModule != NULL ) FreeLibrary( hModule );

return ErrorMsg;

}//GetErrorText
  • 0
    Не думаете ли вы, что это как-то важно, как именно определен макрос?
  • 0
    Как декларируется GL ?
Показать ещё 7 комментариев
Теги:
macros

1 ответ

2
Лучший ответ

GetErrorText() возвращает указатель на локальный буфер:

char Error[ SMALL ] = { 0 };

Таким образом, указатель, который он возвращает, недействителен к тому времени, когда _debugLog.message().

  • 0
    Это может быть глупый вопрос, но как мне правильно его вернуть?
  • 1
    @kampi, вы можете сделать Error static , но лучше было бы вернуть std::string .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню