> Возвращаемое значение - статус, чтобы вызов можно было > ставить прямо в условии, а дополнительные данные > возвращаются через указатели. С одной стороны это удобно, не нужно вызывать GetLastError() в случае ошибки. Но с другой стороны, если учесть то, что не все функции используют этот способ, изменяя значение по переданому указателю (я сталкиваюсь впервые), привыкнув к другому способу возвращения значений, иногда приходится тратить время на поиск несуществущей проблемы. Вот если бы все функции возвращали значения одним способом..
Кто-нибудь сталкивался с ошибкой 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
Сейчас еще раз глянул в 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
Не, проблема не в этом. Места в буфере достаточно. На всякий случай пробовал выделить память и статически и динамически - одна фигня, на некоторые переменные реестра выдается эта ошибка. Есть интересный момент, если в моем примере вместо key[0] = c; написать key[0] = 'w'; или любое другое значение для которого возвращается ошибка, то все будет нормально, 24 раза будет получено значение этой переменной реестра.