RegOpenKeyEx - глюк или меня колбасит?
От: ambient_sky  
Дата: 10.10.02 11:38
Оценка:
Вопчем дело такое.
Программа при запуске считывает данные [параметры] из реестра, если её ключа нет
(конкретно HKCU\Software\firm_name\prog_name)
то прописывает его заново. Хендл потом закрываю. Затем при открытии нового файла она должна записывать его в качестве файла, открываемого по умолчанию. Вот тут начинается самое интересное(непонятное).
При попытке открыть этот ключ (см. выше) RegOpenKeyEx() ф-ция возвращает ошибку
(помоему об отсутствии ключа), хотя ключ в реестре есть( параллельно висит regedit). Код абсолютно такой же, как и в начале.
Builder C++ 5.0/Win2k Prof RU/Admin.
Перерыл кучу факов, форумов, но подобного глюка не нашел. Кода к сожалению привести не могу, забыл взять с собой (инет на работе).
Хееееееееелп!!!
Re: RegOpenKeyEx - глюк или меня колбасит?
От: Patalog Россия  
Дата: 10.10.02 11:49
Оценка:
Здравствуйте ambient_sky, Вы писали:

[]
AS>Перерыл кучу факов, форумов, но подобного глюка не нашел. Кода к сожалению привести не могу, забыл взять с собой (инет на работе).
AS>Хееееееееелп!!!

А по вашему tyt телепаты собрались? Вы бы хоть сказали что RegOpenKeyEx возвращает. В обсчем код в студию, тогда будем посмотреть.
Почетный кавалер ордена Совка.
Re: RegOpenKeyEx - глюк или меня колбасит?
От: VVV Россия  
Дата: 10.10.02 12:38
Оценка:
Здравствуйте ambient_sky, Вы писали:

AS>Вопчем дело такое.

AS>Программа при запуске считывает данные [параметры] из реестра, если её ключа нет
AS>(конкретно HKCU\Software\firm_name\prog_name)
AS>то прописывает его заново. Хендл потом закрываю. Затем при открытии нового файла она должна записывать его в качестве файла, открываемого по умолчанию. Вот тут начинается самое интересное(непонятное).
AS>При попытке открыть этот ключ (см. выше) RegOpenKeyEx() ф-ция возвращает ошибку
AS>(помоему об отсутствии ключа), хотя ключ в реестре есть( параллельно висит regedit). Код абсолютно такой же, как и в начале.
AS>Builder C++ 5.0/Win2k Prof RU/Admin.
AS>Перерыл кучу факов, форумов, но подобного глюка не нашел. Кода к сожалению привести не могу, забыл взять с собой (инет на работе).
AS>Хееееееееелп!!!

На это не похоже?
Q176906
Re[2]: RegOpenKeyEx - глюк или меня колбасит?
От: ambient_sky  
Дата: 16.10.02 11:48
Оценка:
VVV>На это не похоже?
VVV>Q176906

Нея, у меня прога не использует многозадачность
Re: RegOpenKeyEx - глюк или меня колбасит?
От: ambient_sky  
Дата: 17.10.02 13:32
Оценка:
Вот код:
void __fastcall TMainForm::FormShow(TObject *Sender)
{
HKEY hKey;
static DWORD Sz = 512,dwType = REG_SZ;
char *LastDbFile = new char[Sz];
memset(LastDbFile,0,Sz);
if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Catzzz on air\\CDDatabase",0,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(&hKey,"LastDbFile",NULL,&dwType,LastDbFile,&Sz) != ERROR_SUCCESS)
{
MessageBox(NULL,"ss","ssss",MB_OK);
LastDbFile = strcpy(LastDbFile,"DbMain.cdb");
}
RegCloseKey(hKey);
}else
{
HKEY hProgID;
MessageBox(NULL,"Key not exists","key",MB_OK);
RegOpenKeyEx(HKEY_CURRENT_USER,"Software",NULL,KEY_ALL_ACCESS,&hKey);
RegCreateKeyEx(hKey,"Catzzz on air\\CDDatabase",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hProgID,NULL);
RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,(const unsigned char *)"DbMain.cdb",10);
LastDbFile = strcpy(LastDbFile,"DbMain.cdb");
RegCloseKey(hProgID);
}
DataBase = new CdDb(LastDbFile);
CDList->Hint = AnsiString(LastDbFile);
TReportForm *Loading = new TReportForm(Application);
Loading->Label1->Caption = "Загрузка базы данных...";
Loading->Show();
Loading->Update();
int ItemsBufSize = 100,ItemsReaded = ItemsBufSize,CurrentItem = 0;
int Counter = 1;
CdDbItem *CDItems = new CdDbItem[ItemsBufSize];
memset(CDItems,0,ItemsBufSize*sizeof(CdDbItem));
while(ItemsReaded == ItemsBufSize)
{
ItemsReaded = DataBase->GetItemsBuf(CDItems,CurrentItem,ItemsBufSize);
for(int i = 0; i < ItemsReaded; i++)
CDList->Items->Add(AnsiString(Counter++)+". "+AnsiString(CDItems[i].CDname)+" :: "+AnsiString(CDItems[i].Comment));
CurrentItem += ItemsReaded;
}
delete [] CDItems;
delete Loading;
delete [] LastDbFile;
TotalRecs->Caption = "Всего записей: "+AnsiString(DataBase->GetItemsNumber());
DbSize->Caption = "Размер базы: "+AnsiString(DataBase->GetDbSize())+" байт";
CDList->ItemIndex = 0;
RecNo->Caption = "Запись №: "+AnsiString(CDList->ItemIndex+1);
}
//---------------------------------------------------------------------------
......
......
......
// Вот тут все и обламывается

void __fastcall TMainForm::DbFileItemClick(TObject *Sender)
{
static OPENFILENAME of;
memset(&of,0,sizeof(OPENFILENAME));
char *CurrentDir = new char[512];
GetCurrentDirectory(512,CurrentDir);
of.lStructSize = sizeof(OPENFILENAME);
of.lpstrFilter = "Файлы базы данных cddb\0*.cdb\0\0";
of.hwndOwner = NULL;
of.lpstrCustomFilter = NULL;
of.nFilterIndex = 1;
of.nMaxFile = 512;
of.lpstrFile = "";
of.lpstrDefExt = "cdb";
of.lpstrTitle = NULL;
of.lpstrInitialDir = CurrentDir;
of.Flags = OFN_PATHMUSTEXIST;
of.hwndOwner = Application->Handle;
if(GetOpenFileName(&of) != 0)
{
delete DataBase;
DataBase = new CdDb(of.lpstrFile);
HKEY hKey,hProgID;
if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Catzzz on air\\CDDatabase",0,KEY_WRITE,&hKey) == ERROR_SUCCESS)
{
MessageBox(NULL,"Key exists","key",MB_OK);
RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,of.lpstrFile,strlen(of.lpstrFile));
RegCloseKey(hKey);
}else
{
HKEY hProgID;
MessageBox(NULL,"Key not exists","key",MB_OK);
RegOpenKeyEx(HKEY_CURRENT_USER,"Software",NULL,KEY_ALL_ACCESS,&hKey);
RegCreateKeyEx(hKey,"Catzzz on air\\CDDatabase",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hProgID,NULL);
RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,of.lpstrFile,strlen(of.lpstrFile));
RegCloseKey(hProgID);
}
MainForm->Update();
TReportForm *Loading = new TReportForm(Application);
Loading->Label1->Caption = "Загрузка базы данных...";
Loading->Show();
Loading->Update();
CDList->Clear();
int ItemsBufSize = 100,ItemsReaded = ItemsBufSize,CurrentItem = 0;
int Counter = 1;
CdDbItem *CDItems = new CdDbItem[ItemsBufSize];
memset(CDItems,0,ItemsBufSize*sizeof(CdDbItem));
while(ItemsReaded == ItemsBufSize)
{
ItemsReaded = DataBase->GetItemsBuf(CDItems,CurrentItem,ItemsBufSize);
for(int i = 0; i < ItemsReaded; i++)
CDList->Items->Add(AnsiString(Counter++)+". "+AnsiString(CDItems[i].CDname)+" :: "+AnsiString(CDItems[i].Comment));
CurrentItem += ItemsReaded;
}
delete [] CDItems;
delete Loading;
TotalRecs->Caption = "Всего записей: "+AnsiString(DataBase->GetItemsNumber());
DbSize->Caption = "Размер базы: "+AnsiString(DataBase->GetDbSize())+" байт";
CDList->ItemIndex = 0;
CDList->Hint = AnsiString(of.lpstrFile);
RecNo->Caption = "Запись №: "+AnsiString(CDList->ItemIndex+1);
}
}
//---------------------------------------------------------------------------
Re[2]: RegOpenKeyEx - глюк или меня колбасит?
От: SergH Россия  
Дата: 17.10.02 13:54
Оценка:
Здравствуйте ambient_sky, Вы писали:

Вроде всё похоже на правду. Только один момент: ты получаешь избыточные права на ключи. Там где у тебя KEY_WRITE, тебе нужен KEY_SET_VALUE, там, где у тебя KEY_ALL_ACCESS, по-моему, тоже только он.

И всё-таки получи код ошибки, без него твое предположение, что это "ключа нет" несколько необоснованно...
Делай что должно, и будь что будет
Re[2]: RegOpenKeyEx - глюк или меня колбасит?
От: VVV Россия  
Дата: 17.10.02 14:00
Оценка: 40 (3)
Здравствуйте ambient_sky, Вы писали:


Скорее всего — тебя колбасит

1.
    static DWORD Sz = 512,dwType = REG_SZ;

Зачем здесь static? При следующем(не первом) входе в FormShow Sz уже не будет инициализироваться как 512, а будет оставаться тем, что в него записали при предыдущем входе — это так и надо???.

2.
    if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Catzzz on air\\CDDatabase",0,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS) 
    { 
        if(RegQueryValueEx(&hKey,"LastDbFile",NULL,&dwType,LastDbFile,&Sz) != ERROR_SUCCESS) 
        {


из MSDN
LONG RegQueryValueEx(
  HKEY hKey,            // handle to key
...


Надо бы убрать & перед hKey.

3.
Вместо KEY_ALL_ACCESS лучше использовать те флаги, что конкретно нужны — KEY_WRITE, KEY_READ — потому как не под админским экаунтом KAY_ALL_ACCESS может не сработать.

4.функция void __fastcall TMainForm::DbFileItemClick(TObject *Sender)

        HKEY hKey,hProgID; 
        if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Catzzz on air\\CDDatabase",0,KEY_WRITE,&hKey) == ERROR_SUCCESS) 
        { 
            MessageBox(NULL,"Key exists","key",MB_OK); 
            RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,of.lpstrFile,strlen(of.lpstrFile)); 
            RegCloseKey(hKey); 
        }else

открываешь один ключ (hKey) а писать пытаешься в другой (hProgID).

5.

        }else 
        { 
            HKEY hProgID; 
            MessageBox(NULL,"Key not exists","key",MB_OK); 
            RegOpenKeyEx(HKEY_CURRENT_USER,"Software",NULL,KEY_ALL_ACCESS,&hKey); 
            RegCreateKeyEx(hKey,"Catzzz on air\\CDDatabase",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hProgID,NULL); 
            RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,of.lpstrFile,strlen(of.lpstrFile)); 
            RegCloseKey(hProgID); 
        } 
        MainForm->Update();

ключ hKey не закрывается.

Надеюсь, это чуть-чуть поможет.
Re[3]: RegOpenKeyEx - глюк или меня колбасит?
От: SergH Россия  
Дата: 17.10.02 14:05
Оценка:
Здравствуйте VVV, Вы писали:

...

Круто!
Делай что должно, и будь что будет
Re[3]: RegOpenKeyEx - глюк или меня колбасит?
От: VVV Россия  
Дата: 17.10.02 14:10
Оценка:
Здравствуйте VVV, Вы писали:

Вдогонку

6.

LONG RegSetValueEx(
  HKEY hKey,           // handle to key
  LPCTSTR lpValueName, // value name
  DWORD Reserved,      // reserved
  DWORD dwType,        // value type
  CONST BYTE *lpData,  // value data
  DWORD cbData         // size of value data
);


cbData
[in] Specifies the size of the information pointed to by the lpData parameter, in bytes. If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters.

т.е. писать надо примерно так

RegSetValueEx(hProgID,"LastDbFile",0,REG_SZ,of.lpstrFile,strlen(of.lpstrFile)+1);


или +sizeof(TCHAR)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.