IniInit

Считывает и подготавливает копию ini файла в ОЗУ для  работы с ней.

Вариант для ANSI/OEM кодировок в файле
char* IniInit(
    HANDLE hFile,
    size_t *SzBuf
);
Вариант для UTF-8 кодировок в файле
wchar_t* IniWInit(
    HANDLE hFile,
    size_t *SzBuf
);

Параметры

hFile
[вх]
HANDLE открытого файла Win32 функцией CreateFile с атрибутами, допускающими чтение.
SzBuf
[вых] Число символов в загруженном в память ini файле + 1. Данное число используется во всех прочих ini функциях кроме IniUninit.

Возвращаемые значения

Указатель на буфер с загруженным в него ini файлом. Данный указатель используется во всех прочих ini функциях.
0 при сбое. Код ошибки можно получить через GetLastError().

Заметки

Блок выделенной памяти, адрес которого возвращает эта функция, должен освобождаться пользователем вызовом для него функции free() из стандартной библиотеки Си.

Внимание!

Требует линковки с msvcrt! Имеет проблемы с современными компиляторами от Microsoft.

Быстрая справка

ОС Наличие стандартной библиотеки Си, Поддержка WinAPI v4
DLL 2fapShare.dll
Библиотека 2fapShare.lib
Заголовок ini.h

Смотри также

Работа с ini файлами

Исходные коды

Даны как наиболее сложный пример входной подготовки ini файла к работе
wchar_t* IniWInit(HANDLE hFile, size_t *SzBuf)
{    //грузит ini файл в ОЗУ для работы с ним. Вариант для UTF-8 ini файла
    char* UBuf; //буфер-приёмник
    DWORD SzFile; //размер файла
    {
        DWORD SzFileH;
        SzFile = GetFileSize(hFile, &SzFileH);
        if(SzFile == 0xFFFFFFFF && SzFileH == 0)
            return 0;
    }
    if((UBuf = (char*) malloc(SzFile)) == 0)
    {
        SetLastError(8); //недостаточно памяти
        return 0;
    }
    {
        DWORD rdBytes=0;
        OVERLAPPED ovs = {0};
        if(ReadFile(hFile, UBuf, SzFile, &rdBytes, &ovs) == 0)
        {
            free(UBuf);
            return 0;
        }
    }
    char Uf=0;
    if(UBuf[0] == (char) 0xEF && UBuf[1] == (char) 0xBB && UBuf[2] == (char) 0xBF)
        Uf = 3;
    size_t WBufsz = 1 + MultiByteToWideChar(CP_UTF8, 0, UBuf+Uf, SzFile, 0, 0);
    if(WBufsz < 2)
    {
        free(UBuf);
        return 0;
    }
    wchar_t *WBuf = (wchar_t*) malloc(WBufsz * sizeof(wchar_t));
    if(WBuf == 0)
    {
        SetLastError(8); //недостаточно памяти
        return 0;
    }
    if(MultiByteToWideChar(CP_UTF8, 0, UBuf+Uf, SzFile-Uf, WBuf, WBufsz) == 0)
    {
        free(UBuf);
        free(WBuf);
        return 0;
    }
    free(UBuf);
    WBuf[WBufsz-1]=0;
    *SzBuf = WBufsz;
    return WBuf;
}