информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяЗа кого нас держат?Где водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
На самом деле это одно из самых правильных решений 24.10.03 06:16  Число просмотров: 1236
Автор: makeworld Статус: Member
<"чистая" ссылка>
> Возвращаемое значение - статус, чтобы вызов можно было
> ставить прямо в условии, а дополнительные данные
> возвращаются через указатели.
С одной стороны это удобно, не нужно вызывать GetLastError() в случае ошибки. Но с другой стороны, если учесть то, что не все функции используют этот способ, изменяя значение по переданому указателю (я сталкиваюсь впервые), привыкнув к другому способу возвращения значений, иногда приходится тратить время на поиск несуществущей проблемы. Вот если бы все функции возвращали значения одним способом..
<programming>
RegQueryValueEx - Error #234 20.10.03 06:19  
Автор: makeworld Статус: Member
<"чистая" ссылка>
Кто-нибудь сталкивался с ошибкой 234 (More data is available) при использовании сабжевой функции?

Код примерно такой:

// ........

HKEY hk;
if (RegCreateKey(HKEY_LOCAL_MACHINE,MY_REGISTRY_SUBKEY,&hk)) {
  Error1("Could not create registry key");
  return 0;
}
char key[2],buf[BUF_LEN+1];
int sz = BUF_LEN+1;
memset(key,0,2);
char rt[7];
long ret;
for (char c='a';c<='z';c++) {
  memset(buf,0,BUF_LEN+1);
  key[0] = c;
  if (!(ret=RegQueryValueEx(hk,(LPCTSTR)key,NULL,NULL,(LPBYTE)buf,(LPDWORD)&sz))) AddKey(c,buf);
  else Error1(itoa(ret,rt,10));
}
RegCloseKey(hk);

// .......

---

Смысл этого куска такой: в цикле формируется строка, состоящая из одной буквы английского алфавита и проверяется, есть ли такая переменная в реестре. Если есть, выполняем функцию AddKey(), иначе выводим сообщение об ошибке. Проблема в том что для некоторых существующих значений возвращается 234'ая ошибка. Например, есть в реестре переменные с именами a, q, r, w, z. для a, q и z все ок. для r и w ошибка 234. для всех остальных несуществующих, как и положено, ошибка 2. Все переменные имеют тип REG_SZ.
Из-за чего вознивает ошибка 234?
ОС - win2000 sp4, компилятор - VC++.NET
Re: RegQueryValueEx - Error #234 22.10.03 10:00  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
sz = BUF_LEN+1
надо делать перед каждым вызовом RegQueryValueEx()

Удачи :)
Помогло или нет ? 22.10.03 20:47  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
спасибо, помогло.. 23.10.03 06:07  
Автор: makeworld Статус: Member
<"чистая" ссылка>
Сейчас еще раз глянул в MSDN и увидел:
[in/out] Pointer to a variable that specifies the size, in bytes, of the buffer pointed to by the lpData parameter. When the function returns, this variable contains the size of the data copied to lpData.
и почему майкрософтовцы не напишут апи функции так, чтобы юзать их было интуитивно понятно, не зачитывая до дыр MSDN.
На самом деле это одно из самых правильных решений 23.10.03 13:11  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> и почему майкрософтовцы не напишут апи функции так, чтобы
> юзать их было интуитивно понятно, не зачитывая до дыр MSDN.
Возвращаемое значение - статус, чтобы вызов можно было ставить прямо в условии, а дополнительные данные возвращаются через указатели.
На самом деле это одно из самых правильных решений 24.10.03 06:16  
Автор: makeworld Статус: Member
<"чистая" ссылка>
> Возвращаемое значение - статус, чтобы вызов можно было
> ставить прямо в условии, а дополнительные данные
> возвращаются через указатели.
С одной стороны это удобно, не нужно вызывать GetLastError() в случае ошибки. Но с другой стороны, если учесть то, что не все функции используют этот способ, изменяя значение по переданому указателю (я сталкиваюсь впервые), привыкнув к другому способу возвращения значений, иногда приходится тратить время на поиск несуществущей проблемы. Вот если бы все функции возвращали значения одним способом..
Да нет. Это их стандартный ход 24.10.03 10:13  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > Возвращаемое значение - статус, чтобы вызов можно было
> > ставить прямо в условии, а дополнительные данные
> > возвращаются через указатели.
Чтобы убедиться советую поискать сочетание "IN OUT" в platform SDK хедерах (желательно от VC.NET).

> С одной стороны это удобно, не нужно вызывать
> GetLastError() в случае ошибки. Но с другой стороны, если
В случае с RegXxx функциями GetLastError делать все такие надо, потому как возвращаемый статус имеет тип BOOL. Гораздо лучше, когда возвращается NTSTATUS.

> учесть то, что не все функции используют этот способ,
> изменяя значение по переданому указателю (я сталкиваюсь
> впервые), привыкнув к другому способу возвращения значений,
Довольно редко функции так не делают. И в основном это самые старые и сохраняющие прототип только для совместимости. Все более-менее новые при необходимости возврата значения возвращают его через указатель.

> иногда приходится тратить время на поиск несуществущей
> проблемы. Вот если бы все функции возвращали значения одним
> способом..
Они и возвращают. В том числе и ReadFile/WriteFile и многие другие. Вообще у меня двойственное мнение о микрософте. Как только я начинаю убеждаться, что там сидят вполне вменяемые и даже умные программеры происходит что-то (недавний тред про EFS), что убеждает меня в обратном.
Да нет. Это их стандартный ход 25.10.03 07:14  
Автор: makeworld Статус: Member
<"чистая" ссылка>
> В случае с RegXxx функциями GetLastError делать все такие
> надо, потому как возвращаемый статус имеет тип BOOL.
> Гораздо лучше, когда возвращается NTSTATUS.
http://msdn.microsoft.com/library/en-us/sysinfo/base/regqueryvalueex.asp
If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
ИМХО не хватает места в буфере 20.10.03 10:49  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
ИМХО не хватает места в буфере 22.10.03 07:15  
Автор: makeworld Статус: Member
<"чистая" ссылка>
Не, проблема не в этом. Места в буфере достаточно. На всякий случай пробовал выделить память и статически и динамически - одна фигня, на некоторые переменные реестра выдается эта ошибка. Есть интересный момент, если в моем примере вместо key[0] = c; написать key[0] = 'w'; или любое другое значение для которого возвращается ошибка, то все будет нормально, 24 раза будет получено значение этой переменной реестра.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach