找回密码
 加入
搜索
查看: 3067|回复: 15

关于判断开机是否第一次运行程序的问题

[复制链接]
发表于 2009-1-17 13:18:53 | 显示全部楼层 |阅读模式
关键是建立一个标志,每个程序启动时都检测这个标志,如果找到了,就不是第一次运行;如果没有找到当然是第一次运行,然后建立这个标志。方法很多,这里介绍使用Windows API的Gloabal Atom的方法。首先使用FindAtom("MyFlags")查找看有没有一个叫"MyFlags"的标志,没有说明第一次运行,使用GlobalAddAtom("MyFlags")设置标志。如果FindAtom("MyFlags")说明有标志,就说明程序已经运行了一次了。

以上是我在网上找到的一个方法但不知道是调用哪个DLL文件。。该如何实现返回某个程序是否是开机第一次运行的呢?谢谢

[ 本帖最后由 AUFS 于 2009-1-31 01:50 编辑 ]
发表于 2009-1-17 14:10:22 | 显示全部楼层
kernel32.dll
发表于 2009-1-17 16:06:18 | 显示全部楼层
要这么麻烦么 写个当前日期到ini 判断是否有今天的日期就不是第一次运行..
发表于 2009-1-17 18:31:08 | 显示全部楼层
同问,帮顶.................
 楼主| 发表于 2009-1-17 23:41:57 | 显示全部楼层
3楼的可能不明白我的意思了,写个配置文件我当然知道了但意义不同。我要的是判断开机程序是否已运行过。这个功能很实用的。有些程序就只要开机运行一次就行了。
发表于 2009-1-18 01:00:34 | 显示全部楼层
原帖由 AUFS 于 2009-1-17 23:41 发表
3楼的可能不明白我的意思了,写个配置文件我当然知道了但意义不同。我要的是判断开机程序是否已运行过。这个功能很实用的。有些程序就只要开机运行一次就行了。


从ini里读取信息  如果看是否是今天的日期 如果不是 就运行程序

程序结束时写入当前时间到ini

我觉得这个思路可以解决你的问题

第一次运行后 就会写入当前日期到ini
再运行的时候 读取ini信息 是当前日期 就退出
 楼主| 发表于 2009-1-18 13:29:58 | 显示全部楼层
举个例吧!我要的是每次开机都只是只运行一次而不是这一天。
如ISCSI出盘是不是开机只运行一次就够了?但你不可能一天只出一次吧。明白了吗。是每次开机都只是会执行一次而已我现在的办法是写注册表的运行一次之后就在注册表里标记一下如果在注册表里发现标记就表示是运行过了但这方法不灵活,如果可以实现我提问的这个方法就简单方便了不用写任何信息就在API里完成。灵活准确。
发表于 2009-1-18 13:48:52 | 显示全部楼层
汗 那我觉得是你的问题没讲清楚.......
发表于 2009-1-18 14:04:54 | 显示全部楼层
先判断父进程或者父服务是不是explorer.exe或者services.exe
如果是,对比explorer.exe或者services.exe和你的程序/服务的启动时间。误差可以放大点。比如2分钟。
发表于 2009-1-18 17:27:38 | 显示全部楼层
呵呵,难得thesnow肯帮忙,但该如获取explorer.exe的启动时间?楼主的意思是第一次运行,并不是说在开机时运行吧?
 楼主| 发表于 2009-1-19 00:45:03 | 显示全部楼层
想不到这个问题还挺难的啊,谢谢老潇也来捧场。我的开始提问也就提到了这哪个是我在网上找到的一个信息是API的都有资料了这个也是调用API的我想不是很难实现吧。我想哪些游戏更新软件应该也是在API里做标记的就是开机只执行程序一次。
 楼主| 发表于 2009-1-20 13:57:38 | 显示全部楼层
希望E文好的大哥帮帮忙到官方发个贴问问这个问题吧
发表于 2009-1-20 14:33:48 | 显示全部楼层
向内存中写点数据 利用关机时自动清空的特性
发表于 2009-1-21 16:02:40 | 显示全部楼层
程序启动的时候向某文件写入当前时间。
用来作为判断。
当前时间 - 程序启动时间=上一次程序运行的时间。
WINDOWS启动经过的时间 - 上一次程序运行的时间 >0 那么这次启动运行过了。

用0的话非常精确,所以要定义个误差值 比如3秒。

需要用到的函数:
GetTickCount 得到windows经过的毫秒数量。

缺点也很明显,如果更改过时间,就不准了。但是不占用资源,兼容性也比较好。

写内存比较容易准确判断,但是不管你往多少偏移写入都有和其他程序冲突的可能性。
 楼主| 发表于 2009-1-31 01:49:27 | 显示全部楼层
看来还是没有一个比较满意的结果。
我打算这样做了,就是利用参数命令。。。往注册表的启动里写一个带参数的如 AutoExe -Del 这样一开机就会删除原来在注册表里写的标记,然后就是在再次点击autoExe的时候就会往注册表里写一个标记这样暂时用着吧。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-6 09:43 , Processed in 0.085414 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表