
系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表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语言,单片机主要运用到那些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)