WinAPI - функции и особенности
1604
3
Есть вопрос по использованию WinAPI. Конкретно - по функции RegCreateKeyEx (я работаю в си). Это функция для работы с реестром она имеет непонятный параметр: LPTSTR lpClass. Может быть кто-нибудь знает что там надол указывать?
В английской версии хелпа приводится следующее описание:
The RegCreateKeyEx function creates the specified key. If the key already exists in the registry, the function opens it.

LONG RegCreateKeyEx(

HKEY hKey, // handle of an open key
LPCTSTR lpSubKey, // address of subkey name
DWORD Reserved, // reserved
LPTSTR lpClass, // address of class string
DWORD dwOptions, // special options flag
REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security structure
PHKEY phkResult, // address of buffer for opened handle
LPDWORD lpdwDisposition // address of disposition value buffer
);


lpClass

Points to a null-terminated string that specifies the class (object type) of this key. This parameter is ignored if the key already exists.
Судя по описанию (больше судить не по чему, т.к. не доводилось с этим возиться) этот параметр указывает на строку, которая определяет тип ключа в реестре (REG_DWORD, REG_SZ...).
А гуглем брезгуеш?
На первой же странице нашёл описание:
RegCreateKeyEx:

LONG RegCreateKeyEx(
HKEY hKey, // хэндл открытого ключа
LPCTSTR lpSubKey, // имя "под_ключа"
DWORD Reserved, // всегда 0
LPTSTR lpClass, // имя класса
DWORD dwOptions, // специальные опции
REGSAM samDesired, // уровень защиты\доступа
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // параметр важный если хэндл
// ключа будет унаследован
// дочерним процессом

PHKEY phkResult, // в это поле вернется хэндл // созданного ключа

LPDWORD lpdwDisposition // этот параметр показывает
// был ли ключ создан, или
// он уже присутствовал и
// был просто открыт без
// изменения его значения
// (обязательно переменная)
);

* HKEY hkey-хэндл открытого уже ключа или одно из заранее определенных значений:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows NT/2000 or later: HKEY_PERFORMANCE_DATA
Windows 95/98/Me: HKEY_DYN_DATA

* LPCTSTR lpSubKey-собственно имя ключа,который мы хотим создать (должно заканчиваться символом нуль)
* LPTSTR lpClass-для уже существующего ключа игнорируется,вобще почти всегда можно давать этому параметру значение NULL
* DWORD dwOptions-формально,оперделяет,когда ключ начнет действовать, приведу выдранный из MSDN кусок,разобраться в нем не сложно:

REG_OPTION_NON_VOLATILE This key is not volatile; this is the default.
The information is stored in a file and is
preserved when the system is restarted.
The RegSaveKey function saves keys that are
not volatile.

REG_OPTION_VOLATILE Windows NT/2000 or later: All keys created
by the function are volatile. The information
is stored in memory and is not preserved when
the corresponding registry hive is unloaded.
For HKEY_LOCAL_MACHINE, this occurs when the
system is shut down. For registry keys loaded
by the RegLoadKey function, this occurs when
the corresponding RegUnloadKey is performed.
The RegSaveKey function does not save volatile
keys. This flag is ignored for keys that
already exist.
Windows 95/98/Me: This value is ignored.
If REG_OPTION_VOLATILE is specified,
the RegCreateKeyEx function creates
nonvolatile keys and returns ERROR_SUCCESS.

REG_OPTION_BACKUP_RESTORE Windows NT/2000 or later: If this flag is set,
the function ignores the samDesired parameter
and attempts to open the key with the access
required to backup or restore the key.
If the calling thread has the SE_BACKUP_NAME
privilege enabled, the key is opened with
ACCESS_SYSTEM_SECURITY and KEY_READ access.
If the calling thread has the SE_RESTORE_NAME
privilege enabled, the key is opened with
ACCESS_SYSTEM_SECURITY and KEY_WRITE access.
If both privileges are enabled, the key has
the combined accesses for both privileges.

т.к ,к сожалению, на данный момент у меня стоит win98,то этот параметр в ней практически игнорируется.

* REGSAM samDesired-уровень доступа к ключу, подробно описание можно посмотреть во все том же MSDN, скажу только, что для полного доступа значением должно быть KEY_ALL_ACCESS|KEY_READ|KEY_WRITE
* LPSECURITY_ATTRIBUTES lpSecurityAttributes-рассмотрение описания данной структуры в тему данной статьи не входит, это скорее относится к многопоточному программированию,кому же очень интересно-идите к ... ну вы поняли:)
В дальнейшем смысл одноименных параметров сохраняется ,поэтому я буду оговаривать только новые значения и кое-что об их формате.
Следующий вопрос:
Есть функция ReadFile.
В качестве одного из параметров в ней используется указатель на структуру OVERLAPPED. При использовании этой структуры для перемещения текущей позиции в файле в Windows XP, все было нормально (замечу, что файл я открывал без флага OVERLAPPED). Но в Windows 98 такой вариант использования этого аргумента не проходит. Почему-то функция не читает файл и, вне зависимости от того, какие значения стоят в полях структуры, GetLastError возвращает ошибку "конец файла".
Что делать? Как заставить ReadFile правильно обрабатывать структуру? Или, если это невозможно, то как поменять позицию в файле?