关于设置程序自启

be_quiet_endeavor 2018-08-07 01:44:29
我用Qt写了一个小程序,每天开机就会自动弹出一个不同的图片,并且带两句的话,双击能正确运行,但是设置开机自启或者定时启动都会出现启动失败的错误。

求高手指教!
...全文
167 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不用Qt,只是printf输出一句话,看看还正常不。
be_quiet_endeavor 2018-08-08
  • 打赏
  • 举报
回复
谢谢大家,我把程序中关于加载图片的部分注释掉,发现问题就不再出现了,然后我把图片路径改成绝对路径,和exe程序放在不同文件夹,再用静态编译,然后设置开机自启,问题就没有了,有时间我再仔细排查一下吧,现在问题能解决就行,谢谢大家了!
_肆 2018-08-08
  • 打赏
  • 举报
回复
拖到开始->启动文件夹里,不是最简单的开机自启吗
sghcpt 2018-08-08
  • 打赏
  • 举报
回复
楼主,我刚刚在我本地系统,win7,64位的系统下,在注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run下添加了系统启动后启动QT程序项目。我测试的程序有如下文件,helloword.exe,Qt5Core.dll,Qt5Widgets.dll,libgcc_s_dw2-1.dll,libstdc++-6.dll,libwinpthread-1.dll这个六个文件,在本机上测试了几次,都没有出现你说的崩溃情况出现。那估计是你的程序在某些地方的代码没有处理好导致的崩溃出现了。你可以弄个很简单的QT程序在你本机上测试一下,看看是否存在一样的错误。又或者你可以拿到你的程序到别的电脑上试试,是不是还是出现一样的崩溃情况。如果在别的电脑上都出现一样的问题,就需要自己写日志或者生产dump文件,自己排查了。。。
be_quiet_endeavor 2018-08-07
  • 打赏
  • 举报
回复
现在我的程序不带开机自启的功能,我双击是能够正确运行的,但是我用修改注册表让它开机自启,就会弹出上面那个错误提示,不管是动态编译还是静态编译都不行,不知道如何解决,有人遇到过这种问题吗?求指教!
be_quiet_endeavor 2018-08-07
  • 打赏
  • 举报
回复
引用 2 楼 yangyangsnr 的回复:
是不是路径问题,代码使用的是相对路径,设置开机启动时,工作路径下找不到文件。

不是路径的问题,我也试过不用代码设置开机自启,直接修改注册表,还是不行。
孤雲独去闲 2018-08-07
  • 打赏
  • 举报
回复
是不是路径问题,代码使用的是相对路径,设置开机启动时,工作路径下找不到文件。
赵4老师 2018-08-07
  • 打赏
  • 举报
回复
加写日志调试。
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
#pragma warning(disable:4996)
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef _MSC_VER
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;

if (NULL==pszFmt||0==pszFmt[0]) return;
_vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(flog);
}
}
}
void Log(const char *pszFmt,...) {
va_list argp;

Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
int i;
#ifdef _MSC_VER
InitializeCriticalSection(&cs_log);
#else
pthread_mutex_init(&cs_log,NULL);
#endif
for (i=0;i<10000;i++) {
Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
}
#ifdef _MSC_VER
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
//1-79行添加到你带main的.c或.cpp的那个文件的最前面
//81-86行添加到你的main函数开头
//90-94行添加到你的main函数结束前
//在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中
for free~~~ 内附srvany.exe,instsrv.exe,让程序作为服务运行.txt 介绍如下: 让程序作为服务运行 想让一个程序在启动系统的时候自动运行,你有什么好办法?添加到启动组?那如果别人删除掉就不管用了。如果你使用了Windows NT/2000/XP,就可以试试把这个程序添加为一个服务,这样只有拥有权限的人才可以更改服务,只要你设置好权限,就不用担心会被别人删除了。 要把应用程序添加为服务,你需要两个小软件:Instsrv.exe和Srvany.exe。Instsrv.exe可以给系统安装和删除服务,Srvany.exe可以让程序以服务的方式运行。这两个软件都包含在Windows NT Resource Kit里,如果你没有,也可以点击这里下载。 把这两个程序保存在一个方便的位置,例如C盘根目录下。我们举例来说明,把OE作为一个服务添加进Windows XP Professional操作系统中,并把这个服务命名为“Mail”。在运行中输入“CMD”,回车,打开命令行窗口,在提示符后面直接输入:“c:\instsrv.exe Mail c:\srvany.exe”然后回车,其中的“c:\instsrv.exe”和“c:\srvany.exe”表示这两个程序保存的位置,而Mail则是你想添加的服务名称。 运行Regedit打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到刚才添加的Mail,点击右键,新建一个键,命名为“Parameters”,点击新建的Parameters,并再次新建一个名称为“Application”的子键,数据类型为“REG_SZ”,数值为希望作为服务运行的程序的所在位置,如果你的Windows系统安装在C盘下,那么OE的程序位置就是C:\Program Files\Outlook Express\msimn.exe ,把这个路径添入数值中。到现在,这个服务已经成功的添加并且设置好了。如果你希望做的更加专业,可以在Mail服务下建立一个名为Description的子键,数据类型同样为REG_SZ,数值可以写一些你对这个服务的描述,这个我们在后面可以看到。 接下来需要对服务做一些额外的设置,在运行中输入“Services.msc”并回车,在列表中找到我们刚添加的Mail服务,双击打开,来做详细的设置。在“General”选项卡上,我们需要设置这个服务的运行方式,在图二中可以看见,作为一个服务,有“自动(Automatic)”,“手动(Manual)”和“禁止(Disabled)”三种启动类型,按照需要,我们一般设置成自动就可以了。而在“Logon”选项卡下可以设置以什么身份运行这个服务,一般可以不用理会,按照默认的设置。“Recovery”选项卡下则是进行恢复设置的,你可以指定,在服务第一次,第二次和第三次出错之后分别采取什么措施。“Dependencies”则显示了服务之间的依存关系,可以让你察看这个服务的运行依赖哪些其它服务,以及还有什么服务依赖于这个服务。这后面几个对我们一般用户没有什么意义。经过这些设置,你的服务已经完全可以正常工作了。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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