Hata Kodu Numaraları için Metin Arama

Bazen ağ ile ilgili işlevlerden döndürülen hata kodlarıyla ilişkili hata metninin görüntülenmesi gerekir. Bu görevi sistem tarafından sağlanan ağ yönetimi işlevleriyle gerçekleştirmeniz gerekebilir.

Bu iletilerin hata metni, \system32 %systemroot%bulunan Netmsg.dlladlı ileti tablosu dosyasında bulunur. Bu dosya, NERR_BASE (2100) ile MAX_NERR(NERR_BASE+899) aralığında hata iletileri içerir. Bu hata kodları, lmerr.h SDK üst bilgi dosyasında tanımlanır.

LoadLibrary ve LoadLibraryEx işlevleri Netmsg.dllyükleyebilir. FormatMessage işlevi, Netmsg.dll dosyasına ait modül tutamacı verilen bir hata kodunu ileti metniyle eşler.

Aşağıdaki örnekte, sistemle ilgili hata kodlarıyla ilişkili hata metninin görüntülenmesine ek olarak ağ yönetimi işlevleriyle ilişkili hata metninin nasıl görüntüleneceği gösterilmektedir. Sağlanan hata numarası belirli bir aralıktaysa, netmsg.dll ileti modülü yüklenir ve FormatMessage işleviyle belirtilen hata numarasını aramak için kullanılır.

#include <windows.h>
#include <stdio.h>

#include <lmerr.h>

void
DisplayErrorText(
    DWORD dwLastError
    );

#define RTN_OK 0
#define RTN_USAGE 1
#define RTN_ERROR 13

int
__cdecl
main(
    int argc,
    char *argv[]
    )
{
    if(argc != 2) {
        fprintf(stderr,"Usage: %s <error number>\n", argv[0]);
        return RTN_USAGE;
    }

    DisplayErrorText( atoi(argv[1]) );

    return RTN_OK;
}

void
DisplayErrorText(
    DWORD dwLastError
    )
{
    HMODULE hModule = NULL; // default to system source
    LPSTR MessageBuffer;
    DWORD dwBufferLength;

    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
        ))
    {
        DWORD dwBytesWritten;

        //
        // Output message string on stderr.
        //
        WriteFile(
            GetStdHandle(STD_ERROR_HANDLE),
            MessageBuffer,
            dwBufferLength,
            &dwBytesWritten,
            NULL
            );

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

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

Bu programı derledikten sonra, hata kodu numarasını bağımsız değişken olarak ekleyebilirsiniz ve program metni görüntüler. Mesela:

C:\> netmsg 2453
Could not find domain controller for this domain