Операционные системы. Марапулец Ю.В. - 31 стр.

UptoLike

Составители: 

BOOL CReg_OpsDlg::AddToRegistry()
{
HKEY hKeyNew;
RegCreateKey( m_hRegKey, m_csNameEntry, ShKeyNew ) ;
RegSetValueEx( hKeyNew, "Password", NULL, REG_SZ,
(LPBYTE)(LPCTSTR)m_csPassword,
m_csPassword.GetLength()+1 );
Поскольку указывается тип REG_SZ,
к аргументу, задающему размер
значения, необходимо добавить единицу - в таком случае будет включен
завершающий нулевой символ, который не учитывается в значении,
возвращаемом функцией GetLength.
Ранее указывалось, что функции для работы с реестром не распознают
классов библиотеки MFC, в том числе и класс CString, однако в представленном
примере в качестве аргументов использованы две ссылки на этот класс. Причем
в первом случае значение приведено к типу LPCSTR,
определяющему его как
массив символов, во втором же случае передается целочисленное значение,
возвращаемое функцией-членом.
Во второй операции с функцией RegSetValueEx необходимо записать
значение типа DWORD:
RegSetValueEx( hKeyNew, "Status", NULL, REG_DWORD,
(LPBYTE)&m_dwNameStatus, sizeof( m_dwNameStatus) );
return TRUE;
}
Записываемое значение передается с помощью адреса, после которого
указывается размер данных (в байтах). В обеих функциях RegSetValueEx
использован аргумент типа LPBYTE
(указатель на байт) и что данные всегда
должны передаваться по адресу.
5. Рассмотреть подпрограмму системных сообщений об ошибках.
В
данном случае для интерпретации сообщений об ошибках, возвращаемых
функциями RegQueryInfoKey, RegEnumKey и RegQueryValueEx, применяется
функция ReportError. При вызове функции ReportError ей в качестве аргумента
передается код ошибки, возвращаемый любой другой функцией, которая
осуществляет обращение к реестру. В функции ReportError вызывается функция
FormatMessage с флагом FORMAT_MESSAGE_FROM_SYSTEM,
которая
возвращает строку с разъяснением соответствующей системной ошибки. Флаг
FORMAT_MESSAGE_ALLOCATE_BUFFER
позволяет использовать
допустимый указатель буфера, реально не выделяя его. Функция FormatMessage
сама управляет выделением памяти, руководствуясь размером сообщения. При
использовании флага FORMAT_MESSAGE_ALLOCATE_BUFFER
после
завершения работы необходимо вызвать функцию LocalFree и освободить
память, выделенную для размещения буфера.
31
BOOL CReg_OpsDlg::AddToRegistry()
{
    HKEY hKeyNew;
    RegCreateKey( m_hRegKey, m_csNameEntry, ShKeyNew ) ;
    RegSetValueEx( hKeyNew, "Password", NULL, REG_SZ,
               (LPBYTE)(LPCTSTR)m_csPassword,
               m_csPassword.GetLength()+1 );

      Поскольку указывается тип REG_SZ, к аргументу, задающему размер
значения, необходимо добавить единицу - в таком случае будет включен
завершающий нулевой символ, который не учитывается в значении,
возвращаемом функцией GetLength.
      Ранее указывалось, что функции для работы с реестром не распознают
классов библиотеки MFC, в том числе и класс CString, однако в представленном
примере в качестве аргументов использованы две ссылки на этот класс. Причем
в первом случае значение приведено к типу LPCSTR, определяющему его как
массив символов, во втором же случае передается целочисленное значение,
возвращаемое функцией-членом.
      Во второй операции с функцией RegSetValueEx необходимо записать
значение типа DWORD:

     RegSetValueEx( hKeyNew, "Status", NULL, REG_DWORD,
                     (LPBYTE)&m_dwNameStatus, sizeof( m_dwNameStatus) );
     return TRUE;
}

     Записываемое значение передается с помощью адреса, после которого
указывается размер данных (в байтах). В обеих функциях RegSetValueEx
использован аргумент типа LPBYTE (указатель на байт) и что данные всегда
должны передаваться по адресу.
     5. Рассмотреть подпрограмму системных сообщений об ошибках. В
данном случае для интерпретации сообщений об ошибках, возвращаемых
функциями RegQueryInfoKey, RegEnumKey и RegQueryValueEx, применяется
функция ReportError. При вызове функции ReportError ей в качестве аргумента
передается код ошибки, возвращаемый любой другой функцией, которая
осуществляет обращение к реестру. В функции ReportError вызывается функция
FormatMessage с флагом FORMAT_MESSAGE_FROM_SYSTEM, которая
возвращает строку с разъяснением соответствующей системной ошибки. Флаг
FORMAT_MESSAGE_ALLOCATE_BUFFER                 позволяет       использовать
допустимый указатель буфера, реально не выделяя его. Функция FormatMessage
сама управляет выделением памяти, руководствуясь размером сообщения. При
использовании флага FORMAT_MESSAGE_ALLOCATE_BUFFER после
завершения работы необходимо вызвать функцию LocalFree и освободить
память, выделенную для размещения буфера.

                                    31