Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу добиться от функции работы [D7, D2005, 2000, XP, 2003]


InfraRed ©   (2007-01-18 01:26:00) 

Задаю параметр для открытия ключа HKEY_USERS
То Функция RegEnumKeyEx возвращает список ключей

Задаю параметр для открытия ключа HKEY_LOCAL_MACHINE
Функция RegEnumKeyEx ни какого списка не возвращает видимую ошибку не возвращает - догнать не могу чево нехватает.

procedure TForm1.Button1Click(Sender: TObject);
Var Rez: Integer;
   Buff: Pointer;
   i: integer;
   Name: String;
   BuffSise: Cardinal;
   MyKey: HKEy;
begin
 Rez:=RegConnectRegistry(PChar(edName.Text), HKEY_LOCAL_MACHINE,REMOT_KEY);
 if Rez <> ERROR_SUCCESS then begin ShowMessage('Connection No!'); Exit; End;
 ShowMessage('Connection Ok!');
 try
   Lst := TStringList.Create;
   i:=0;
   BuffSise:=1024;
   GetMem(Buff,BuffSise);
   while RegEnumKeyEx(REMOT_KEY,i,buff,BuffSise,Nil,NIl,Nil,Nil) = ERROR_SUCCESS do
     begin
       Application.ProcessMessages;
       BuffSise:=1024;
       SetLength(Name,BuffSise);
       CopyMemory(@Name[1],Buff,BuffSise);
       Lst.Add(Name);
       Inc(i);
     end;
   Memo1.Lines.AddStrings(Lst);
 finally
   FreeMem(Buff,BuffSise);
   RegCloseKey(REMOT_KEY);
   Lst.Free;
 end;
end;


InfraRed   (2007-01-18 19:16:00) [1]

Vmware не причем. Тестировал на физической локалке функция:

RegOpenKeyEx(REMOT_KEY,PChar(edSubKey.text),0,KEY_QUERY_VALUE,SubKey)
не открывает ключи, Но соединение проходит ОК!

Функция  RegEnumKeyEx может перечислить ключи в только текущем HKEY_LOCAL_MACHINE

Так и не пойму чего еще нехватает?


InfraRed   (2007-01-18 14:15:00) [2]

> Джо ©   (18.01.07 13:07) [12]
> Кстати, что это значит? Т.е.: «работу не выполняет».

С этим я и пытаюсь разобраться.
Я сное дело, что машины в сетке я юзаю на vmware там несколько адаптеров один для vmnat vmhost-only
Вот когда остается включенным vmnat адаптер то происходит следующеее конект =  ERROR_SUCCESS
Функция RegEnumKeyEx в цикле тоже = ERROR_SUCCESS Но данные пусты Буффер = 0

При включенных обоих адаптерах все происходит Ок! Но Можно просмотреть ключи первого уровня а Подключи уже не открываются в следующем коде:

if RegOpenKeyEx(REMOT_KEY,PChar(edSubKey.text),0,KEY_QUERY_VALUE,SubKey) = ERROR_SUCCESS then begin
   ShowMessage('Open Key Ok!');
   RegEnumKeys(SubKey,'',Name); //from Uses Minireg.pas
   Memo1.Text:=Name;
 end


Некак не могу понять или это из за глюков vmware всетаки специфическая сеть. Или еще какие нибудь привелегии иметь надо в коде и как ошибку поймать тоже не понимаю пока.


Джо   (2007-01-18 13:07:00) [3]

> Но суть в том, что она возвращает правильные ответ, но
> работу не выполняет в одних случаях, а вдругих выполняет

Кстати, что это значит? Т.е.: «работу не выполняет».


Джо   (2007-01-18 12:55:00) [4]

А в цикле while вообще не обрабатывается результат возврата, кроме как на ERROR_SUCCESS.


Джо   (2007-01-18 12:53:00) [5]

RegEnumKeyEx также (кроме кода ошибки) еще и может возвратить ERROR_NO_MORE_ITEMS и ERROR_MORE_DATA.


infraRed   (2007-01-18 12:46:00) [6]

> Джо ©   (18.01.07 12:38) [8]
> Примерчик в [1].

И то правильно потому, что RegEnumKeyEx(REMOT_KEY,i,buff,BuffSise,Nil,NIl,Nil,Nil) = ERROR_SUCCESS

По спецификации возвращает только ERROR_SUCCESS если правильно работает, Но суть в том, что она возвращает правильные ответ, но работу не выполняет в одних случаях, а вдругих выполняет. Как же причину разыскать?


Джо   (2007-01-18 12:38:00) [7]

> какойбы нибудь примерчик как содерзание ошибка извлечЬ?
> или примерчик применения  RaiseLastOSError  очень плиз.

Примерчик в [1].


infraRed   (2007-01-18 12:35:00) [8]

Unit
SysUtils

Syntax
[Delphi] procedure RaiseLastOSError(); overload;
[Delphi] procedure RaiseLastOSError(LastError: Integer); overload;
Description

- вот в справке нашел в модуле систем нашел:

procedure RaiseLastOSError;
begin
 RaiseLastOSError(GetLastError);
end;

какойбы нибудь примерчик как содерзание ошибка извлечЬ? или примерчик применения  RaiseLastOSError  очень плиз.


Джо   (2007-01-18 12:23:00) [9]

> [5] infraRed   (18.01.07 12:20)
> > Джо ©   (18.01.07 01:32) [1]
> -  RaiseLastOsError ни чем не отличается от LastError

Оно отличается тем, что вызывает исключение с текстовымописанием ошибки, а не просто кодом.


infraRed   (2007-01-18 12:20:00) [10]

> Джо ©   (18.01.07 01:32) [1]
-  RaiseLastOsError ни чем не отличается от LastError

LastError  - а получение оного мне ни очем не говорит, как извлеч причину ошибки? Допустим  GetLastError = 997


infraRed   (2007-01-18 12:05:00) [11]

nobless obligeэто кто есть такой?


Германн   (2007-01-18 02:28:00) [12]


> InfraRed   (18.01.07 02:03) [2]
>
> Разобрался таки - проблема была в сетевых адаптерах.
>

Ну так nobless obligeдолжно бы было заставить тебя "прояснить сию проблему" и выдать решение!


InfraRed   (2007-01-18 02:03:00) [13]

Разобрался таки - проблема была в сетевых адаптерах.


Джо   (2007-01-18 01:32:00) [14]

Код не смотрел, но вместо
> if Rez <> ERROR_SUCCESS then begin ShowMessage('Connection
> No!');

используй
if not .... then
  RaiseLastOsError;


чтобы увидеть вразумительное сообщение об ошибке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо