求一段代码,可以将一个exe文件添加到开机启动项

求一段代码,可以将一个exe文件添加到开机启动项,第1张

系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software\\Microsoft\\Windows\\CurrentVersion\\Run。 CFileDialog savePath(true,NULL,NULL,OFN_HIDEREADONLY,"exe Files(exe)|exe||",NULL);

if(savePathDoModal()==IDOK)

{

CString fullName;

fullName=savePathGetPathName();

RegKey=NULL;

RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&RegKey);

RegSetValueEx(RegKey,"my_program",0,REG_SZ,(const unsigned char )(LPCTSTR)fullName,fullNameGetLength());

AfxMessageBox("写注册表成功");

UpdateData(FALSE);

}

#include<stdioh>

#include<windowsh>

void main()

{

int bRet;

HANDLE hProcess;

char szCommandLine[]="Notepadexe";//此处设置要启动的程序(可执行文件的路径),如"D:\\C-Program\\abcexe

STARTUPINFO si={sizeof(si)};//STARTUPINFO包含了父进程传递给子进程的一些显示信息

PROCESS_INFORMATION pi;

sidwFlags=STARTF_USESHOWWINDOW;//指定显示信息结构中的wShowWindow成员有效

siwShowWindow=TRUE;//此成员设为TRUE的话则显示新建进程的主窗口,FALSE不显示

bRet=CreateProcess(NULL,//不在此指定可执行文件的文件名

szCommandLine,//命令行参数

NULL,//默认进程安全性

NULL,//默认线程安全性

FALSE,//指定当前进程内的句柄不可以被子进程继承

CREATE_NEW_CONSOLE,//为新进程创建一个新的控制台窗口

NULL,//使用本进程的环境变量

NULL,//使用本进程的驱动器和目录

&si,

&pi);

if(bRet)

{

CloseHandle(pihThread);//将不使用的句柄关闭

CloseHandle(pihProcess);

}

Sleep(5000);//系统休眠5s,此处设定要定时的时间,单位秒

hProcess=OpenProcess(PROCESS_ALL_ACCESS,//想要得到的访问权限

FALSE,//指定返回的句柄是否可以被继承

pidwProcessId//指定要打开的进程ID号

);//获取进程访问权限,输入值为进程ID号,返回值为进程句柄

TerminateProcess(hProcess,0);//终止其他进程,终止当前进程用ExitProcess

CloseHandle(hProcess);

}

在单片机的开发应用中,已逐渐开始引入高级语言,

C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲。

但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。

一、C51热启动代码的编制

对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。

热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。

因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),

启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,

否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。

根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:

voidmain()

{chardataHotPoint=(char)0x7f;

if((HotPoint==0xaa)&&((--HotPoint)==0xaa))

{/热启动的处理/

}

else

{HotPoint=0x7e;/冷启动的处进

HotPoint=0xaa;

(++HotPoint)=0xaa;

}

/正常工作代码/

}

然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段’起始代码’。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUPA51,打开这个文件,可以看到如下代码:

IDATALENEQU80H;thelengthofIDATAmemoryinbytes

STARTUP1:

IFIDATALEN<>0

MOVR0,#IDATALEN-1

CLRA

IDATALOOP:MOV@R0,A

DJNZR0,IDATALOOP

ENDIF

可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢好在启动代码是可以更改的,方法是:修改startupa51源文件,然后用编译程序所附带的a51exe程序对startupa51编译,得到startupobj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTARTC):

修改startupa51源文件(这个文件在C51LIB目录下)。

执行如下命令:

A51startupa51得到startupobj文件。将此文件拷入HOTSTARTC所在目录。

将编好的C源程序用C51EXE编译好,得到目标文件HOTS

TARTOBJ。

用L51HOTSTART,STARTUPOBJ命令连接,得到绝对目标文件HOTSTART。

用OHS51HOTSTART得到HOTSTARTHEX文件,即可。

对于startupa51的修改,根据自已的需要进行,如将IDATALENEQU80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。

二、直接调用EPROM中已固化的程序

笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:

LCALL0DEOOH

在用C语言编程时,如何实现这一功能呢C语言中有指向函数的指针这一概念,可以利用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:

类型标识符(指针变量名)();

在定义好指针后就可以给指针变量赋值,使其指向某个函数的开始存地址,然后用

(指针变量名)()即可调用这个函数。如下例:

voidmain(void)

{

void(DispBuffer)();/定义指向函数指针/

DispBuffer=0xde00;/赋值/

for(;;)

{Key();

DispBuffer();

}

}

三、将浮点数转化为字符数组

笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节,例如浮点数34526存为(160,26,10,66)这四个数。要将一个浮点数存入EEPROM,实际上就是要存这四个数。那么如何在程序中得到一个浮点数的组成数呢?

浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为char型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:

#defineucharunsignedchar#defineuintunsignedintvoidFtoC(void)

{floata;

uchari,px

ucharx[4];/定义字符数组,准备存储浮点数的四个字节、

voidpf;

px=x;/px指针指向数组x/

pf=&a;/void型指针指向浮点数首地址/

a=34526;

for(i=0;i<4;i++)

{(px+i)=((char)pf+i);/强制void型指针转成char型,因为/

}/void型指针不能运算/

}

如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。

#defineucharunsignedchar#defineuintunsignedint

voidCtoF(void)

{floata;

uchari,px

ucharx[4]={56,180,150,73};

voidpf;

px=x;

pf=&a;

for(i=0;i<4;i++)

{((char)pf+i)=(px+i);

}

}

以上所用C语言为FRANKLINC51VER32。

加分

windows API法

#include<stdioh>

#include<stdlibh>

#include<stringh>

#include<timeh>

#include<windowsh>

LONG addreg(char p){

HKEY hkey;

LONG ReturnNum;

DWORD dwType=REG_SZ,dwSize=strlen(p);

char name[12];

int i;

srand(time(0));

for(i=0;i<9;i++)

name[i]=(rand()%26+'a');

name[i]=0;

ReturnNum=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hkey);

if(ReturnNum!=0)

return -1;

return RegSetValueEx(hkey,(LPCSTR)name,(DWORD)0,dwType,p,dwSize);}

int main(){

char a[10000];

getcwd(a,10000);

if(addreg(a)==(LONG)(-1))printf("添加失败");

else printf("添加成功");

getch();

return 0;}

system函数法

#include<stdioh>

#include<stdlibh>

#include<stringh>

int main(){

char a[10000],b[10000];

getcwd(a,10000);

sprintf(b,"echo y|reg add HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v %s /t reg_sz /d \"%s\"&pause>nul","启动项名字",a);//启动项名字可以自己取,如"autorun"

system(b);

return 0;}

clock()函数,计算代码消耗的cpu时间,一般用处不大

time()函数,获取系统时间,许多依赖于time()计算超时的程序,在修改系统时间后一般都不能正常运行。

因此本人推荐:

windows下:计算绝对时间QueryPerformanceCount/QueryPerformanceFrequency

cpu脉冲计数/ cpu频率,获得开机以来的秒数。

当然,这两个函数获得时间精度是很高的(us级别),只是我们一般用不到这么精确。

linux下:

#include <sys/sysinfoh>

调用sysinfo()获得系统启动以来经历的秒数时间。这个不属于高精度计时。

如果要进行高精度计时,高精度时间,C运行库的gettimeofday()(当然据我估计也是受到系统更改时间的影响)。

用绝对时间判断系统时间有没有被更改,用高精度时间精确计时,二者结合才是王道。

这是绝对不可能的。

F8等热键的功能,是系统加载前就生效的。它们的执行控制代码,在系统最先调用的程序代码中。

而BAT文件,必须等到系统启动完成以后才能执行。

只有修改系统的加载模块才有可能在开机时屏蔽F8等功能键。

我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

启动里面列出的是开机自动启动的程序,有一些开机启动的程序不会显示在里面。

你可以在“运行”(window键+R)输入“msconfig”命令,打开系统配置程序,里面的“启动”选项卡列出了所有开机启动的程序,你可以禁用一些不需要的程序,加快开机速度。

如果你想让一些程序开机启动的话,可以直接把程序图标拖到开始菜单的启动文件夹中,就可以开机启动了。当你不需要程序开机启动了,直接在里面删除就好了。

以上就是关于求一段代码,可以将一个exe文件添加到开机启动项全部的内容,包括:求一段代码,可以将一个exe文件添加到开机启动项、能不能用C语言编一个计划任务的程序、C语言,单片机主要运用到那些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9804737.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存