由于寝室电费分配不均匀,所以写了一个PCM(PC manager),来管理计算机的开关计时.现总结一下:
系统功能:
记录用户从安装软件(程序)开始至当前总共使用的时间(UFile,UTFile,ULogFile类)
记录系统的开机关机,注销的时间(捕获系统关机消息)
创建快捷方式
(1) UFile
封装这个文件操作类,以后的工作就简单一些了,其中遇到一些问题。
首先弄清楚fopen的参数:
r 打开文件,如果文件不存在,则调用失败
w 不论文件是否存在,都新建一个文件(如果文件存在则被覆盖)
a 以附加的方式打开,在这种情况下,只能在文件的最后添加数据
+ 如果上面的(暂且称为 '标记')加上一个'+',那么打开的文件就成了既可读有可写了.如 r+,w+,a+( 注意: a+任然只能在文件末尾"更新",而且a+和a对EOF的操作也有所不同)
另外: b,t 也是非常重要的参数
主要区别在于:
二进制模式不用说,内存中的数据就是文件中的数据。
文本模式 :
内存中 文件中
写入 0x0A ------> (0x0D,0x0A)
读取 0x0A <------ (0x0D,0x0A)
文本模式写入0x0A,二进制模式读取则会得到两个字符(0x0D,0x0A)
二进制模式写入0x0A或是(0x0D,0x0A),文本模式读取则只会得到一个字符0x0A,所以在文本模式下文件大小不等于写入的字符数.
其中括号()说明是一起写入或读出的。
另外,判断文件结尾也是很重要的, EOF == 0xffffffff; ( - 1 ),
int i = 0;
while( ( i = fget(FILE *stream ) != EOF );这样才能真确的判断文件是否结束,但是在fget()出错时,也会返回-1,
所以最好是调用 int feof( FILE *stream );,但要注意这个函数要碰到EOF的下个字符时才返回nozreo.如果用feof();的话会显得很麻烦,
所以可以在返回 - 1 后在调用feof() 一次.
(2)UTFile
这是一个对文本模式文件操作的类,其中最值得注意的是: 以覆盖方式向文件的第n行写入数据时,怎样保证写入的数据是一行呢,并不是简单的写入一个'/n'就完了,如果写入的一行数据大于原来第n的数据,则会覆盖到第n+1的数据,如果写入的数据小于原来第n的数据,则会多出来xxx+'/n',有两种方法 (1)读出第n+1行之后的所有数据,我这里正是使用的这种方法 (2)用系统[windows]的SetEndOfFile()函数可以截断文件[即写入一个EOF到当前文件偏移],我觉得这种方法不错,不过我没有实践过,下次有时间再来了.
(3)ULogFile,这是一个日志类,完全基于UTFile,没什么好说的
(4)附加
1. 创建快捷方式的一个函数,网上找到的
BOOL CreateLink(LPWSTR szPath, LPSTR szLink)
{
CoInitialize(NULL);
HRESULT hres;
IShellLink* psl;
IPersistFile* ppf;
WCHAR wsz[MAX_PATH];
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void**)&psl);
if(FAILED(hres))
return FALSE;
psl->SetPath(szPath);
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if(FAILED(hres))
return FALSE;
MultiByteToWideChar(CP_ACP, 0, szLink, -1, wsz, MAX_PATH);
hres = ppf->Save(wsz, STGM_READWRITE);
ppf->Release();
psl->Release();
CoUninitialize();
return TRUE;
}
2.系统托盘图标(网上好找,代码有点多)
3.当用户关机时,程序做出响应
只要响应 ENDSESSION 或者 WM_QUERYENDSESSION 消息就可以了