PCM总结

由于寝室电费分配不均匀,所以写了一个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  消息就可以了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值