我做一个程序要在系统(win98,win2000,winxp)启动时起动.
我所知道的,有:
1.可以在StartUp开始菜单里设置。
2.可以在注册表的run里设置。
3.可以在Win.ini里设置。
4.Autoexec.bat
但是这些很容易被处理掉。
在什么地方,还有什么方法可以实现在系统启动时起动。这个是一个强制管理的一个软件。要求被管理者,通过常规方法不能使它不启动。
我可以另开帖给分,如果有好的解决办法和源码。

解决方案 »

  1.   

    http://search.csdn.net/expert/topic/50/5001/2002/10/25/1125913.htm
      

  2.   

    在NT或2K下在每次重启进来时自动运行。1、利用"开始"菜单中的"启动"程序项。凡是拖入该程序项的程序都可以实现自动运
    行。将程序拷贝到"C:\Documents and Settings\All Users\「开始」菜单\程序\启动"
    (要根据注册表来查找这个目录)这个目录下即可。2、利用win.ini文件中的run变量。编辑win.ini,为run变量赋值。如run= 某程序,可
    以使某程序实现自动运行。 
    写win.ini文件
    [windows] 
    load=file.exe 
    run=file.exe 
    注意:load=与run=的区别在于:通过load=运行文件,文件会在后台运行(最小化);
    而通过run=来运行,则文件是在默认状态下被运行的。3、利用注册表。通过修改注册表中相关项,实现程序自动运行。 
    看上去,第一种方法是最容易实现的。由于所谓的"开始"程序菜单实际上是一个特殊
    目录下的特殊文件。其目录一般在c:\ windows \ start menu \ programs下。"启动"
    程序项的目录一般为c:\ windows \ start menu \ programs \ 启动。这样程序只要
    在把自身拷贝到此目录下就可以实现程序自动运行了。然而这里有个问题,如果出现
    特殊情况,"启动"程序项的目录不在理想目录下呢?自动运行显然无法实现了。要解
    决这个问题,我们可以利用注册表得到有关信息。在注册表
    hkey_users\.default\software\microsoft\windows\ currentversion\explorer\
    shell folders下,读取startup项的值就可以知道"启动"程序项的准确目录了。对于
    注册表的操作,c++ builder3提供了tregister类,使用十分方便。关于tregister类
    的具体介绍,大家可以参考c++ builder3的在线帮助,这里就不多阐述了。
    程序如下: tregister  *test;
    test = new tregister();
    test->rootkey = hkey_users;
    if(test->openkey(".default\\software\\microsoft\\windows\\currentversion\\
        explorer\\shell folders",false))
        path = test->readstring("startup");    //获得"启动"程序项准确目录
    delete test;对于第二种方法,关键在于对win.ini的读写。win.ini为windows启动时初始配置文件,
    存放在系统目录下。系统目录可以在注册表hkey_local_machine \software\windows\
    currentversion下,通过读取systemroot值得到。程序自身的存放路径可以利用
    c++ builder3中application类的exename变量得到。使用c++ builder3提供的
    tinifile类,我们可以十分方便地对ini文件进行操作。程序如下: 
      tregister  *test;
      tinifile  *inifile;
      test = new tregister();
      test->rootkey = hkey_local_machine;
      if(test->openkey("software\\windows\\currentversion",false))
            path = test->readstring("systemroot");    //获得windows系统目录
      delete test;
      path = path + "\\win.ini";                //获得win.ini的完整路径
      inifile = new tinifile(path);
      inifile->writestring("windows","run",application->exename); 
      // run =  执行文件名
      delete inifile;
      
    对于第三种方法,实现起来最为隐蔽。如果不了解注册表,想去掉自动执行都不行哦。
    在注册表hkey_local_machine \software \ microsoft \ windows \ currentversion
    \run下的所有程序项都可以被windows自动执行。因此,我们可以通过添加新程序项实
    现自动执行功能。程序如下: 
    tregister  *test;
    test = new tregistry();
    test->rootkey = hkey_local_machine;
    if(test->openkey("software\\microsoft\windows\\currentversion\\run",false))
         test->writestring("my program",application->exename);
    delete test;//
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
      

  3.   

    guoxiny(狼) :真让人佩服!!
      

  4.   

    sunnf(sunnf) :的方法,我要试一下,比较难一些。
    guoxiny(狼) ( ) :你第一次说的,很容易被处理掉。
             你第二次说的,注册成服务是什么意思?
    还有这个程序在运行时,是不能被停止的。
      

  5.   

    在注册表里写一笔:HKEY_LOCAL_MACHINE ;
    "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
      

  6.   

    To: guoxiny(狼)  
        老大,这里好象问的是VC,你所说的方法谁都知道!可人家要的是VC源码!
      

  7.   

    matq2008(叶子.net) 
    这个一般人都知道,会把它删除的。
      

  8.   

    win98 VXD, win2k WDM will solve your problem.
      

  9.   

    Anikan(皮皮鱼) :
     能否有详细的,最好有个例子代码。
    我会另开帖给分。