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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Windows API. Доступ к информации о ключе реестра, имя ключа по его handle (HKEY) 
:(
    Опции темы
grin1978
Дата 28.5.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.5.2008

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



Всем ТРЯМ!

Кароче проблемка откопалась. Есть набор API функций для работы с реестром (ну например RegOpenKey, RegCloseKey, RegEnumKey и т.п.). Среди них есть RegQueryInfoKey. Назначение этой функции думаю всем понятно - получить некоторые данные о ветке ключа реестра:
LONG RegQueryInfoKey (

    HKEY hKey,    // handle of key to query 
    LPTSTR lpClass,    // address of buffer for class string 
    LPDWORD lpcbClass,    // address of size of class string buffer 
    LPDWORD lpReserved,    // reserved 
    LPDWORD lpcSubKeys,    // address of buffer for number of subkeys 
    LPDWORD lpcbMaxSubKeyLen,    // address of buffer for longest subkey name length  
    LPDWORD lpcbMaxClassLen,    // address of buffer for longest class string length 
    LPDWORD lpcValues,    // address of buffer for number of value entries 
    LPDWORD lpcbMaxValueNameLen,    // address of buffer for longest value name length 
    LPDWORD lpcbMaxValueLen,    // address of buffer for longest value data length 
    LPDWORD lpcbSecurityDescriptor,    // address of buffer for security descriptor length 
    PFILETIME lpftLastWriteTime    // address of buffer for last write time 
   );
И все бы хорошо, но предполагается что hKey я должен получить зная полный путь этой ветки. У меня же задача немного обратная. Есть hKey, а надо узнать путь, ну или хотя бы имя ключа.

Вот так вот, какие мнения?

С Уважением Дмитрий 
PM MAIL   Вверх
just_geek
Дата 28.5.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: нет
Всего: 10



Код

LSTATUS SHRegGetPath(          HKEY hkey,
    LPCTSTR pszSubkey,
    LPCTSTR pszValue,
    LPTSTR pszPath,
    DWORD dwFlags
);


Вроде то smile
PM MAIL   Вверх
grin1978
Дата 28.5.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.5.2008

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



Спасибки!!!  smile  Счас проверю, и скорее всего тема будет закрыта.

Добавлено через 12 минут и 46 секунд
Пока проверить не удается, пишу проектик на BCB. Там нашел эту функцию в shlwapi.h, но проект не собиратеся, не может найти бинарник ентой функции
PM MAIL   Вверх
jonie
Дата 28.5.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 118



а ты еще lib файл подключи такой же (предположительно) по имени и все скомпилируется.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
alias_trinity
Дата 29.5.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 10.5.2007

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



#pragma comment (lib,"shlwapi.lib")
PM MAIL   Вверх
grin1978
Дата 3.6.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.5.2008

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



Кароче все равно не то, SHRegGetPath используется для того чтобы получить полный путь из относительного на основе указателя на текущий узел -1, имени дочернего ключа (SubKey) - 2.

Вобщем в любом случае у меня изначально есть только указатель на ключ реестра - HKEY.

PM MAIL   Вверх
Rrader
  Дата 5.6.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Поэкспериментируй:
Код

#include <windows.h>

typedef enum tagKEY_INFO_CLASS
{
    KEY_BASE_INFORMATION = 0,
    KEY_NODE_INFORMATION,
    KEY_FULL_INFORMATION,
    KEY_NAME_INFORMATION
} KEY_INFO_CLASS;

// Native API
typedef DWORD (__stdcall *ZW_QUERY_KEY)(HKEY, KEY_INFO_CLASS, PVOID, DWORD, PDWORD);

bool RegGetKeyPath(HKEY _hKey, WCHAR *_pszWay)
{
    if((_hKey == INVALID_HANDLE_VALUE) || (_pszWay == NULL))
        return false;
    
    ZW_QUERY_KEY pQueryKeyProc;
    PBYTE pData;
    DWORD nDataLen;
    if((pQueryKeyProc = (ZW_QUERY_KEY)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwQueryKey")) != NULL)
    {
        (*pQueryKeyProc)(_hKey, KEY_NAME_INFORMATION, NULL, NULL, &nDataLen);
        try
        {
            pData    = new BYTE[nDataLen];
        }
        catch(...)
        {
            return false;
        }
        (*pQueryKeyProc)(_hKey, KEY_NAME_INFORMATION, pData, nDataLen, &nDataLen); 
        memcpy(_pszWay, &pData[4], *((PDWORD)pData));
        delete[] pData;
        return true;
    }  
    return false;
}

void main()
{
    HKEY hKey;
    WCHAR szWay[MAX_PATH] = L"";
    // Проверка
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        if(RegGetKeyPath(hKey, szWay))
            MessageBoxW(0, szWay, L"Information", MB_OK | MB_ICONINFORMATION);
        RegCloseKey(hKey);
    }
};

Примечания:
MACHINE - HKEY_LOCAL_MACHINE
USER - HKEY_CURRENT_USER. Причем далее идет код.

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


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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