Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetPrivateProfileString: входной буфер 
V
    Опции темы
Alca
Дата 9.4.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Вопрос по ::GetPrivateProfileString. 
Код

DWORD WINAPI GetPrivateProfileString(
  __in   LPCTSTR lpAppName,
  __in   LPCTSTR lpKeyName,
  __in   LPCTSTR lpDefault,
  __out  LPTSTR lpReturnedString,  //вх. буфер
  __in   DWORD nSize,                    //размер вх. буфера
  __in   LPCTSTR lpFileName
);

Как узнать, что размера входного буфера мал для хранения значения ключа (в определенной секции)?

Добавлено @ 12:53
Код

const INT ciLineSize = 10;
    
sRes.resize(ciLineSize);

for ( ; ; ) {
    ulRes = ::GetPrivateProfileString(csSection.c_str(), csKey.c_str(), csDefaultValue.c_str(), &sRes.at(0), sRes.size(), _m_sFilePath.c_str());

    if (_T('\0') == sRes.at(ulRes)) {
        sRes.resize(sRes.size() * 2);
    } else {
        break;
    }
}

Так?

Добавлено @ 12:59
не так  smile 

Это сообщение отредактировал(а) Alca - 9.4.2010, 13:01


--------------------
PM WWW ICQ Skype Jabber   Вверх
GremlinProg
Дата 9.4.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Alca @  9.4.2010,  14:46 Найти цитируемый пост)
Как узнать, что размера входного буфера мал для хранения значения ключа (в определенной секции)?

сам сталкивался - ни как,

если хочешь универсальное чтение строки или списка строк из ini-файла, то только последовательным наращиванием буфера, пока число скопированных символов не станет четко меньше числа переданных символов, учитывая терминаторы для обоих видов результата: единичной строки и списка строк, т.е. в идеале это неравенство должно быть четко меньше минимум на 2 символа


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alca
Дата 9.4.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Типа так?
Код

tString CXIni::sReadString(const tString &csSection, const tString &csKey, const tString &csDefaultValue) {
    tString           sRes;
    const std::size_t cuiLineSize = 256;
    ULONG             ulRes       = 0;

    sRes.resize(cuiLineSize);

    for ( ; ; ) {
        ulRes = ::GetPrivateProfileString(
                    csSection.c_str(), 
                    csKey.c_str(), 
                    csDefaultValue.c_str(), 
                    &sRes.at(0), 
                    sRes.size(), 
                    _m_sFilePath.c_str());

        if (ulRes + 2 < sRes.size()) {
            sRes.resize(ulRes);
            break;
        } else {
            sRes.resize(sRes.size() * 2);
        }
    }

    return sRes;
}


Это сообщение отредактировал(а) Alca - 9.4.2010, 14:00


--------------------
PM WWW ICQ Skype Jabber   Вверх
GremlinProg
Дата 9.4.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ну да,
а еще лучше будет выделить отдельную функцию со статическим буфером, который увеличивать по мере необходимости (но не уменьшать)

p.s.:только надо помнить, что этот вариант потоконебезопасен (безопасным он будет либо с критической секцией, либо с TlsAlloc/Get/Free)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alca
Дата 9.4.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Цитата

а еще лучше будет выделить отдельную функцию со статическим буфером, который увеличивать по мере необходимости (но не уменьшать)

Я наверное чего-то не понял? std::string (tString) походу это делает.

Это сообщение отредактировал(а) Alca - 9.4.2010, 14:07


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 11.4.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



IniFiles.pas, CG 2010:
Код

procedure TIniFile.ReadSection(const Section: string; Strings: TStrings);
var
  Buffer, P: PChar;
  CharCount: Integer;
  BufSize: Integer;

  procedure ReadStringData;
  begin
    Strings.BeginUpdate;
    try
      Strings.Clear;
      if CharCount <> 0 then
      begin
        P := Buffer;
        while P^ <> #0 do
        begin
          Strings.Add(P);
          Inc(P, StrLen(P) + 1);
        end;
      end;
    finally
      Strings.EndUpdate;
    end;
  end;

begin
  BufSize := 1024;

  while True do
  begin
    GetMem(Buffer, BufSize * SizeOf(Char));
    try
      CharCount := GetPrivateProfileString(PChar(Section), nil, nil, Buffer, BufSize, PChar(FFileName));
      if CharCount < BufSize - 2 then
      begin
        ReadStringData;
        Break;
      end;
    finally
      FreeMem(Buffer, BufSize);
    end;
    BufSize := BufSize * 4;
  end;
end;



Это сообщение отредактировал(а) Alca - 11.4.2010, 13:45


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1294 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.