写注册表让程序自动启动的问题!

ctyrzf 2007-11-06 03:00:36
如下方式设置程序在系统启动时自动运行:
bool CMyApp::SetAutoRun()
{
HKEY hKey;
LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurentVersion\\Run";
LPCTSTR lpPath =path;
LPCTSTR keyname="MyExe";
if(!::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey))
{
MessageBox(NULL,"无法打开注册表","课表查询",MB_OK|MB_ICONINFORMATION);
return 0;
}
if( ERROR_SUCCESS!=::RegSetValueEx(hKey,keyname,NULL,REG_SZ,(const BYTE*)&lpPath,
strlen(lpPath)+1))
{
MessageBox(NULL,"设置 ‘随系统启动’ 失败","MyExe",MB_OK|MB_ICONINFORMATION);
LPSTR lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,NULL,
GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,0,NULL);
MessageBox(NULL,lpMsgBuf,"Get Last Error",MB_OK | MB_ICONEXCLAMATION);
LocalFree(lpMsgBuf);
return 0;
}

return 1;
::RegCloseKey(hKey);
}
其中的路径path是通过如下方式获取的:
::GetModuleFileName(NULL,path,256);//获取可执行文件路径
_splitpath(path,drive,dir,title,ext);//拆分文件路径

现在的问题是,程序不能正确写注册表。执行上面 代码就提示:"设置 ‘随系统启动’ 失败",然后弹出错误原因“无效的窗口句柄”,察看注册表,Software\\Microsoft\\Windows\\CurentVersion\\Run下也没有通过RegSetValueEx设置的启动项。
程序已经做到最后,被这个小问题烦了几个星期都解决不了,不知道错在哪里,所以请大家帮忙看一下,谢了。
...全文
183 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsphuang 2007-11-06
  • 打赏
  • 举报
回复
必须是class的member,很古怪阿!
ctyrzf 2007-11-06
  • 打赏
  • 举报
回复
搞定了。
是HKEY hKey;得声明为类的数据成员,不能是局部变量,就这么简单。
以前好像 也遇到过,改变字体时,也有变量得声明为类的数据成员。怎么都没人提这一点呢?
smartdrvsky 2007-11-06
  • 打赏
  • 举报
回复
检查出来了把问题说一下哈
凤矶 2007-11-06
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20071020/14/57fd29b5-9ad1-46c0-a6fb-ea8d6ddd333b.html
ctyrzf 2007-11-06
  • 打赏
  • 举报
回复
smartdrvsky的例子能够的注册表进行操作,看来一定是我那个地方有问题 ,自己再好好检查。谢了,大家。
smartdrvsky 2007-11-06
  • 打赏
  • 举报
回复
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////

//注册表操作
HKEY hKey;
char content[256]; //所查询注册表键值的内容
DWORD dwType = REG_SZ; //定义读取数据类型
DWORD dwLength = 256;
HKEY RootKey; //注册表主键名称
TCHAR *SubKey; //欲打开注册表项的地址
TCHAR *KeyName; //欲设置项的名字
TCHAR *ValueName; //欲设置值的名称
LPBYTE SetContent_S; //字符串类型
int SetContent_D[256]; //DWORD类型
BYTE SetContent_B[256]; //二进制类型

int ShowContent( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName);
int SetValue_S( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPBYTE ReSetContent_S);
int SetValue_D( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,int ReSetContent_D[256]);
int SetValue_B( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,BYTE ReSetContent_B[256]);
int DeleteKey( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReKeyName);
int DeleteValue( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName);

//查看函数
int ShowContent( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName)
{
int i = 0; //操作结果:0==succeed
if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_READ,&hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hKey,ReValueName,NULL,&dwType,(unsigned char *)content,&dwLength) != ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
i = 1;
}
RegCloseKey(hKey);
}
else
{
AfxMessageBox("错误:无法打开有关的hKEY");
i = 1;
}
return i;
}

//设置字符串值函数
int SetValue_S( HKEY ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPBYTE ReSetContent_S)
{
int i = 0; //操作结果:0==succeed
if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey) == ERROR_SUCCESS)
{
if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()) != ERROR_SUCCESS)
{
AfxMessageBox("错误:无法设置有关的注册表信息");
i = 1;
}
RegCloseKey(hKey);
}
else
{
AfxMessageBox("错误:无法查询有关的注册表信息");
i = 1;
}
return i;
}
guo_wei 2007-11-06
  • 打赏
  • 举报
回复
HKEY hKey;
LPCTSTR data_Set= "Software\\Microsoft\\Windows\\CurrentVersion\\Run ";
LPCTSTR lpPath =path;
LPCTSTR keyname= "MyExe ";

if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey) != ERROR_SUCCESS)
{
MessageBox(NULL, "无法打开注册表 ", "课表查询 ",MB_OK ¦MB_ICONINFORMATION);
return 0;
}

这么写应该不会出错的
ctyrzf 2007-11-06
  • 打赏
  • 举报
回复
在RegOpenKeyEx中用FormatMessage获取错误,还是那个“无效的窗口句柄”,难道还有什么地方有错么?
ctyrzf 2007-11-06
  • 打赏
  • 举报
回复
thisisyjs 真强 ," CurrentVersion”写掉一个字母了,我老半天都看不出来,真是谢了。
不过改过后,提示“无法打开注册表”, 连RegOpenKeyEx都失败了,这又为什么 阿?
guo_wei 2007-11-06
  • 打赏
  • 举报
回复
你第一步应该是失败了,if(!::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey))这里这么判断不对,像下面一样用ERROR_SUCCESS判断,估计是3楼说的那个地方的问题
ctyrzf 2007-11-06
  • 打赏
  • 举报
回复
是管理员权限,我把杀毒软件、防火墙都关掉试过,还是一样的。我也把卡巴的注册表主动防御打开,想看一看卡巴能不能拦截到我对注册表的访问,可卡巴什么反应都没有,这就大概说明了它好像没有对注册表进行操作。
thisisyjs 2007-11-06
  • 打赏
  • 举报
回复
这里: LPCTSTR data_Set= "Software\\Microsoft\\Windows\\CurentVersion\\Run ";
改为: LPCTSTR data_Set= "Software\\Microsoft\\Windows\\CurrentVersion\\Run ";
guo_wei 2007-11-06
  • 打赏
  • 举报
回复
你写的是local_machine还是current_user键下的这个地方,非管理员权限是无法写local_machine的
zaodt 2007-11-06
  • 打赏
  • 举报
回复
这就是一个读写注册表的操作。

如果保证程序没有问题的话,可以换一台计算机试试看。

或者把计算机中的其它什么杀毒软件、防火墙什么的关掉试试看。

16,466

社区成员

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

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

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