请问为何注册表保存不了?

pfstudio 2002-05-10 12:41:38
我使用以Reg开头的API来对注册表进行操作,可以进行新建,打开,查询,关闭等操作,为何保存进去的数据在启动后就没了.我在使用RegSetValueEx()之后用RegFlushKey和RegCloseKey()了.请问为何???谢谢!
...全文
104 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chehw 2002-05-14
  • 打赏
  • 举报
回复
你在RegCreateKeyEx中用了REG_OPTION_VOLATILE, 所有修改只保存在内存中。应设为REG_OPTION_NON_VOLITILE
BuZhang_AP97091 2002-05-14
  • 打赏
  • 举报
回复
// Registry.cpp

#include "stdafx.h"
#include "Registry.h"

CRegistry::CRegistry()
{

m_hKey = NULL;
Open( m_hKey, m_strUseKey );

}

CRegistry::CRegistry( HKEY hKey, const char *lpszSubKey )
{

m_hKey = NULL;
Open( hKey, lpszSubKey );

}

CRegistry::~CRegistry()
{

Close();

}

BOOL CRegistry::Open( HKEY hKey, const char *lpszSubKey )
{

Close();

if( ::RegOpenKeyEx( hKey, lpszSubKey, 0, KEY_ALL_ACCESS, &m_hKey ) != ERROR_SUCCESS ){
m_hKey = NULL;
m_dwLastError = GetLastError();
return( FALSE );
}

return( TRUE );

}

BOOL CRegistry::Close( void )
{
BOOL bRet = TRUE;

if( m_hKey == NULL )
return( FALSE );

bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS );
m_hKey = NULL;

return( bRet );

}

BOOL CRegistry::IsOpen( void )
{

return( m_hKey != NULL );

}

BOOL CRegistry::Read( const char *lpszValueName, LPVOID lpReturnBuffer, int nSize )
{

if( m_hKey == NULL )
return( FALSE );

DWORD dwSize = (DWORD) nSize;
BOOL bRet = ( ::RegQueryValueEx( m_hKey, lpszValueName, NULL, NULL, (unsigned char *) lpReturnBuffer, &dwSize ) == ERROR_SUCCESS );

m_dwLastError = GetLastError();

return( bRet );

}

BOOL CRegistry::ReadDWORD( const char *lpszValueName, DWORD *pdwData, DWORD *pdwLastError )
{

if( m_hKey == NULL )
return( FALSE );

BOOL bRet = Read( lpszValueName, pdwData, sizeof( DWORD ) );

if( pdwLastError != NULL )
*pdwLastError = m_dwLastError;

return( bRet );

}

BOOL CRegistry::ReadString( const char *lpszValueName, LPVOID lpReturnBuffer, int nSize, DWORD *pdwLastError )
{

if( m_hKey == NULL )
return( FALSE );

char *lpWork = (char *) lpReturnBuffer;
lpWork[0] = 0;
BOOL bRet = Read( lpszValueName, lpReturnBuffer, nSize );

if( pdwLastError != NULL )
*pdwLastError = m_dwLastError;

return( bRet );

}

char **CRegistry::ReadMultipleStrings( const char *lpszValueName, DWORD *pdwLastError )
{
char szEntireString[2500];

if( !ReadString( lpszValueName, szEntireString, 2500, pdwLastError ) )
return( NULL );

if( szEntireString[0] == 0 )
return( NULL );

int nCount = 0;
if( szEntireString[strlen(szEntireString)-1] != ';' )
nCount = 1;
char *pPointer = szEntireString;
do{
pPointer = strstr( pPointer, ";" );
if( pPointer != NULL ){
nCount++;
pPointer++;
}
} while( pPointer != NULL );

int i = 0;
char *pEnd;
char **pList = (char **) new char [(nCount+3)*sizeof(char *)];
if( pList == NULL )
return( NULL );
memset( pList, 0, ( nCount + 3 ) * sizeof(char *) );

pPointer = szEntireString;
do{

pEnd = strstr( pPointer, ";" );
int nSize = strlen( pPointer );
if( pEnd != NULL )
nSize = pEnd - pPointer;

pList[i] = new char [nSize+3];
if( pList[i] != NULL ){
memset( pList[i], 0, nSize + 3 );
memcpy( pList[i], pPointer, nSize );
}
else pEnd = NULL;

pPointer = pEnd;
if( pPointer != NULL )
pPointer++;

i++;

} while( pPointer != NULL && pPointer[0] != 0 );

return( pList );

}

void CRegistry::DeleteList( char **pList )
{

if( pList == NULL )
return;

int i = 0;
while( pList[i] != NULL ){
delete [] pList[i];
i++;
}
delete pList;

}

BOOL CRegistry::WriteDWORD( const char *lpszValueName, DWORD dwData, DWORD *pdwLastError )
{

if( m_hKey == NULL )
return( FALSE );

m_nSize = sizeof( DWORD );
BOOL bRet = Write( lpszValueName, &dwData, REG_DWORD, sizeof( DWORD ) );

if( pdwLastError != NULL )
*pdwLastError = m_dwLastError;

return( bRet );

}

BOOL CRegistry::WriteString( const char *lpszValueName, LPVOID lpData, DWORD *pdwLastError )
{

if( m_hKey == NULL )
return( FALSE );

m_nSize = 2000;
BOOL bRet = Write( lpszValueName, lpData, REG_SZ, (DWORD) strlen( (const char *) lpData ) + 1 );

if( pdwLastError != NULL )
*pdwLastError = m_dwLastError;

return( bRet );

}

BOOL CRegistry::Write( const char *lpszValueName, LPVOID lpData, DWORD dwType, int nSize )
{

if( m_hKey == NULL )
return( FALSE );

DWORD dwSize = (DWORD) m_nSize;
BOOL bRet = ( ::RegSetValueEx( m_hKey, lpszValueName, 0, dwType, (unsigned char *) lpData, nSize ) == ERROR_SUCCESS );

m_dwLastError = GetLastError();

return( bRet );

}

BOOL CRegistry::CreateKey( HKEY hKey, const char *lpszSubKey, const char *lpszClass )
{
HKEY hOpenedKey;
DWORD dwDisposition;
DWORD dwLastError;

BOOL bRet = ( ::RegCreateKeyEx( hKey, lpszSubKey, 0, (char *) lpszClass, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hOpenedKey, &dwDisposition ) == ERROR_SUCCESS );
if( bRet ) ::RegCloseKey( hOpenedKey );
dwLastError = GetLastError();

return( bRet );

}

BOOL CRegistry::DeleteKey( HKEY hKey, const char *lpszSubKey )
{
BOOL bRet;
DWORD dwLastError;

bRet = ( ::RegDeleteKey( hKey, lpszSubKey ) == ERROR_SUCCESS );
dwLastError = GetLastError();

return( bRet );

}
BuZhang_AP97091 2002-05-14
  • 打赏
  • 举报
回复
// Registry.h

class CRegistry
{

public:
CRegistry();
CRegistry( HKEY, const char * );
~CRegistry();

BOOL Open( HKEY, const char * );
BOOL Close( void );
BOOL IsOpen( void );

BOOL ReadDWORD( const char *, DWORD *, DWORD *pdwLastError = NULL );
BOOL ReadString( const char *, LPVOID, int, DWORD *pdwLastError = NULL );
char **ReadMultipleStrings( const char *, DWORD *pdwLastError = NULL );
static void DeleteList( char ** );

BOOL WriteDWORD( const char *, DWORD, DWORD *pdwLastError = NULL );
BOOL WriteString( const char *, LPVOID, DWORD *pdwLastError = NULL );
BOOL Write( const char *, LPVOID, DWORD, int );

static BOOL CreateKey( HKEY, const char *, const char * );
static BOOL DeleteKey( HKEY, const char * );
BOOL Read( const char *, LPVOID, int );

protected:
HKEY m_hKey;
DWORD m_dwLastError;
int m_nSize;
char *m_strUseKey;
// BOOL Read( const char *, LPVOID, int );

};
BuZhang_AP97091 2002-05-14
  • 打赏
  • 举报
回复
给您两个好东东:
AmiaBoy 2002-05-13
  • 打赏
  • 举报
回复
我试了,这样子在2000下是可以的:
DWORD dwCreate;
HKEY m_keyOpen,m_keyCreate;
::RegOpenKeyEx(HKEY_LOCAL_MACHINE,NULL,0,0,
&m_keyOpen);
::RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\aaa",0,NULL,0,0,NULL,&m_keyCreate,&dwCreate);
RegCloseKey(m_keyCreate);
RegCloseKey(m_keyOpen);
AmiaBoy 2002-05-13
  • 打赏
  • 举报
回复
你必须先把HKEY_LOCAL_MACHINE用RegCreateKeyEx打开!!!

msdn:
The key identified by the hKey parameter must have been opened with KEY_CREATE_SUB_KEY access. To open the key, use the RegCreateKeyEx or RegOpenKeyEx function.
pfstudio 2002-05-13
  • 打赏
  • 举报
回复
首先非常感谢各位的支持,现答复如下:
一,我是以Administrator登录的,应该有写入的权限的.
二,我的程序是可以正常运行的,可能写进去,可以对项进行读取,修改.
三,我在98下面没试过.
我想可能主要是RegCreateKeyEx这个函数有用的有问题,因为我按要求自己手工去建一个,修改一些值,重启还是有的,而且修改过的的值也保存了.
我的语句如下:
DWORD dwDisposition=REG_CREATED_NEW_KEY;
::RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\MyAppConfig",0,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hKey,&dwDisposition);

不知为什么?请各位帮忙,谢谢!
keenhaung 2002-05-13
  • 打赏
  • 举报
回复
在98下可以?那可能是写入权限的问题了
Flysnow 2002-05-12
  • 打赏
  • 举报
回复
楼上的说的是,是不是有没有写入权限啊
技无止境 2002-05-12
  • 打赏
  • 举报
回复
请注意一下权限,你运行时有真的写入权限吗?
twtpdc 2002-05-12
  • 打赏
  • 举报
回复
另外补充一下:
楼主所说的问题
在2K下不行,在98下可以!
webber84 2002-05-12
  • 打赏
  • 举报
回复
你先打开注册表确认一下到底有没有写进去。
keenhaung 2002-05-12
  • 打赏
  • 举报
回复
现在注册表里看看写进去了没有啊
Flysnow 2002-05-12
  • 打赏
  • 举报
回复
读注册表值;
HKEY hKey;
DWORD dwDisposition;
DWORD dwLength=20;
CHAR user[10];
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,"NETWORK\\Logon",0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition)!=ERROR_SUCCESS)
return TRUE;
if (RegQueryValueEx(hKey,"username",NULL,NULL,(LPBYTE)&user,&dwLength)
!= ERROR_SUCCESS)
AfxMessageBox("FAIL");
AfxMessageBox(user);
RegCloseKey(hKey);

删注册表值;
HKEY hKey;
DWORD dwDisposition;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition)!=ERROR_SUCCESS)
{
AfxMessageBox("FAIL");
return;
}
if (RegDeleteValue(hKey,"TimeTool")!= ERROR_SUCCESS)
AfxMessageBox("FAIL");
AfxMessageBox("OK");
RegCloseKey(hKey);

写注册表值;
HKEY hKey;
DWORD dwDisposition;
DWORD dwLength=20;
CHAR user[12] = "F:\\pass.exe";
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition)!=ERROR_SUCCESS)
{
AfxMessageBox("FAIL");
return;
}
if (RegSetValueEx(hKey,"TimeTool",0,REG_SZ,(BYTE*)&user,dwLength)
!= ERROR_SUCCESS)
AfxMessageBox("FAIL");
AfxMessageBox("OK");
RegCloseKey(hKey);
surfl 2002-05-10
  • 打赏
  • 举报
回复
强烈关注!
chehw 2002-05-10
  • 打赏
  • 举报
回复
看一下你在RegCreateKeyEx中是否设置了REG_OPTION_VOLATILE
lid617914 2002-05-10
  • 打赏
  • 举报
回复
用AfxGetApp()->WriteProfileString();试一下啊

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧