永才's profile守候爱BlogListsGuestbookMore Tools Help

守候爱

爱在哪里

永才 马

Occupation
Location
Interests
感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.

(CSDN)blog头条

Loading...Loading...
October 01

放假啦!

终于放假了,再不来个长假让我休息下,我估计真的要崩溃了。。。
 
但是郁闷的是好不容易放假了,但是早上却睡不着了,还是往常一样7点钟准时醒来,但是不同的是往常还想睡,但是今天却一点也不想睡,唉,真是犯贱了。
 
上午看完阅兵式,中午和同学吃了个午饭,下午就无所事事了,我该做什么呢?
 
哈哈,就这样无所事事吧,先祝大家中秋快乐!
September 27

How in feel

已经连续快一个月没有周末双休了,不过今天还好,心里总是想着还有几天就可以彻底放松下了,晚上也不用加班(实际上晚上还是加了一会),心里就不那么紧绷着了。
国庆节会轻松吗?想想回来后就要有两场重要的考试,一场编程2级考试,一场敏捷考试,都是要命的考试。
 
什么时候才能彻底放松下,不带负担,不带压力的工作呢?
 
只能说,
   feel so bad....
September 23

好久没更新了

好久没更新了,以后我要经常写点东西,不然不要说历史,哪怕短短几年时间,一些美好的东西也会遗忘,就当未来的回忆录看了。
其实这么长的时间,回忆起来,确实没有任何心得,没有获取,也没有付出,我不喜欢的这样的生活。
不过倒是静下心来,读了许多书,大学毕业后,就再也没有这么静心读书过了,也是一种奢侈的享受吧!
June 15

[转帖]高考0分作文——这孩子太有才了!

 

作文题目:“细雨湿衣看不见,闲花落地听无声”是唐朝诗人刘长卿在《别严士元》中的诗句。曾经有人这样理解这句诗:1、这是歌颂春天的美好意境。2、闲花、细雨表达了不为人知的寂寞。3、看不见、听不见不等于无所作为,是一种恬淡的处世之道。 4、这种意境已经不适合当今的世界……根据你的看法写一篇作文。题目自拟,体裁不限。字数800以上。

盛夏,夜,深夜。

景山山颠。

山上有人,两个人,一男一女。

这两人就是当今武林名声最响的两位杀手,男的名秋细雨,女的叫叶闲花,江湖人称“细雨闲花”。

    诗人刘长卿曾用“细雨湿衣看不见,闲花落地听无声”来描述这两个可怕的杀手。细雨湿衣,湿衣的是鲜血;闲花落地,落地的是人头。这两人杀人来无影去无踪,如果他们想杀你,当你还没看到他们人影没听到他们声音的时候,你就已经死了。

秋细雨三天前接到一份帖子,指名要杀叶闲花。事成之后,不但有三百万两冥币,更可以让他在“红楼梦中人”选秀节目中担任曹雪芹的角色!

但是杀死叶闲花比杀死比尔还要困难得多。

江湖中没有一个人清楚叶闲花的武功来历,性格脾气,但是每个人都知道叶闲花的故事。

叶闲花有一双迷人的大眼睛,据说她曾一动不动地瞪死过赵薇和高圆圆,而那一年她才十七岁。

叶闲花声音有如黄莺般幽婉醉人,传说听过她说话后林志玲身体酥麻了整整一年,你说要不要命?

叶闲花轻功独步武林,踏雪无痕,落地无声,号称超过当年青翼蝠王韦一笑。有人见她上星期在高速公路上偷了刘翔奥运会入场证,刘翔追出一万公里最后被活活累倒。

一般人听到叶闲花的故事早就吓得去买尿不湿了,但是秋细雨没有去买。

秋细雨不是一般人。

他知道,杀人不但要靠技术,还要拼人品!

秋细雨很镇定,他正用一把指甲刀修整着手指甲,他的手指修长有力。

他要等待,等待对方先沉不住气。高手相争,不允许一丝一毫的失误,先沉不住气的人就会露出破绽。

致命的破绽!

因此秋细雨一言不发,只是静静地玩弄着指甲刀。

没想到叶闲花更是好整以暇,自己悠然自得地涂口红,喷香水。

秋细雨只好先发制人,道:“你知道我找你出来是为什么。”

叶闲花温柔道:“在我们动手之前,不能先谈谈么?”

秋细雨道:“我是来杀人的,不是来聊天的。”

叶闲花道:“你有把握杀我?”

秋细雨道:“我从不做没有把握的事情。”

叶闲花道:“我要提醒你一件事。”

秋细雨道:“你说。”

叶闲花道:“百晓生作杀手谱,小女子是杀手榜排名第一,阁下区区第二,你真能杀得了我么?”

秋细雨道:“我也要提醒你一件事。”

叶闲花道:“你说。”

秋细雨道:“论杀手实力,我本在你之前,只是那次排名百晓生采用了短信投票系统,中国‘花痴’人数过于庞大才让你得了第一。”

叶闲花的脸色一变,道:“我更要提醒你,我的粉丝团叫‘花粉’,不叫‘花痴’!”

秋细雨道:“我最后要提醒你,你的那些‘花粉’全都是花痴。还有,我们已经跑题了。”

叶闲花道:“我们这样拼命厮杀,你难道不怕麻烦么?”

秋细雨道:“你以后再也不用怕麻烦了,天下只有一种人永远不怕麻烦,死人!”

叶闲花道:“这么说你非逼我出手不可?”

秋细雨没有回答,他已不用回答。

秋细雨道:“亮兵器!”

叶闲花道:“我用刀。”

秋细雨道:“你用刀?刀在何处?”

叶闲花道:“我就是刀!”

叶闲花露出甜甜的笑容,忽然间褪下了自己的衣服,全身上下只剩下蕾丝比基尼和黑色丝袜。

叶闲花的脸美得让人窒息,再配上这样的身材,这样的服饰,充满了一种原始的诱惑力。

她的眼睛会说话,她的媚笑会说话,她的手,她的胸膛,她的腿……她身上每分每寸都会说话。

她知道,只要是个不瞎的男人,现在肯定会被她迷得神魂颠倒。

秋细雨是个男人,而且是个不瞎的男人。

可他现在却偏偏好像瞎了一样,完全无动于衷。

他知道,美丽的女人是一把刀,当你沉醉的时候,刀就会切进你的胸口。

秋细雨沉吟道:“我只想问你一件事。”

叶闲花娇笑着:“请讲。”

秋细雨道:“大夏天的,穿这么少你丫不怕蚊子叮啊?”

叶闲花沉默了半晌,幽幽地道:“你一定以为刚才我在喷香水,是不是?我告诉你,我喷的是六神花露水!”

叶闲花又道:“不过这不是普通的六神,是我特别提炼的药水,无色无味无毒,不过却会慢慢扩散在空气中,闻到它的人会四肢麻痹不能动弹。”

秋细雨一惊,忽然觉得身体已经麻木不听使唤,不由得一身冷汗。

叶闲花又道:“你以为我和你扯淡是因为我害怕,以为我脱掉衣服是想**你,其实这都是为了拖延时间让药水能扩散到你周围。”

秋细雨面上不动声色,道:“难道你自己不怕药水的厉害?”

叶闲花得意地道:“一开始我涂的口红就是解药,所以我仍然可以自由行动。”

叶闲花逼视着秋细雨,问道:“现在你还认为你能杀了我么?”

秋细雨道:“我能。”

叶闲花道:“你不能动而我能动,你却能杀了我,这不是很好笑么?”

秋细雨道:“是很好笑,但是你一定会被我杀死。”

叶闲花道:“为什么我会被你杀死?”

秋细雨忽然反问道:“飞刀能不能杀人?”

叶闲花道:“好像能。”

秋细雨道:“我有没有手?”

叶闲花道:“的确有。”

秋细雨道:“我手上有没有刀?”

叶闲花道:“你手上好像只有指甲刀。”

秋细雨道:“足够了。”

叶闲花道:“足够了?”

秋细雨道:“我有手有刀,就能置人死地。”

叶闲花道:“指甲刀也能杀人?实在可笑!”

秋细雨道:“以前江湖中有七十三个人觉得我这把指甲刀很可笑。”

叶闲花道:“现在呢?”

秋细雨道:“现在人都已死了,死在这把刀下。”

叶闲花道:“你的手还能动?”

秋细雨道:“你要不要试试?”

 叶闲花脸上的笑容渐渐凝固,忽然间,她已出手!

一招“冒牌九阴白骨爪”直逼秋细雨天灵盖,这一招她已练过七年四个月零二十九天,她完全有把握相信没有任何人可以抵挡得了这一招。

可这一次她错了。

刀光一闪,“盗版小李飞刀”已插入她的咽喉。

她到死也不相信,一把指甲刀可以要了她的命!

闲花终于落地!

三个时辰后,药水的药效渐渐淡去,秋细雨终于可以动弹了。

望着叶闲花的尸体,秋细雨道:“虽然你已经死了,但是我还要告诉你两件事。第一,我一直用甲刀修整着手指甲是为了调整手和刀之间的同步率,说白了就是找手感。第二,我杀你的真正目的不是为了钱或者名利。”

 一边说,秋细雨一边从叶闲花衣服的口袋里搜出了刘翔的奥运会入场证。

秋细雨坚定地说:“我爱北京,我要看奥运!”

从此,再也没有人见过秋细雨

September 03

转帖:C和C++编程和学习文档(二)

二、 利用VC++编程实现程序自动启动的编程实例。
  微软公司提供的VC++ 6.0程序开发工具功能非常强大。在VC++ 6.0中同时具有对注册表和*.INI文件操作的函数。笔者经过一段时间的摸索,成功的利用VC++ 6.0开发成功了一个小软件,该软件利用系统自动启动程序的原理,将原来需要的繁琐的手动工作转变成成计算机的自动设置工作,使系统自动启动相关程序的设置工作变的非常简单可靠。
1.程序功能概述:
  程序的主界面是对话框,在主界面对话框中有编辑框(EDIT BOX),圆形按钮(RADIO BUTTON)和普通按钮(COMMON BUTTON)组成。操作者通过向编辑框中添加需要自动加载的程序的全文件名(也可以通过浏览按钮来完成),然后通过对两个RADIO BUTTON的选择,进而完成对加载方式的选择(是选用注册表方式还是选者修改WIN.INI文件的方式),最后操作者通过点击"应用"按钮实现程序的自动加载功能,同时系统会提示操作者是否将操作计算机重新启动,以便观察程序的具体功能完成情况。程序在WIN98中调试运行正常。
2.编码说明:
① 浏览按钮的功能代码:
void CAutoloadDlg::OnLiulan()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(_T("Executable Files (*.exe) |*.exe ||")));//显示打开文件的对话框
if(fileDlg.DoModal()==IDOK)//当操作者选择OK时,程序,取得选择文//件的全路径名(包括文件的路径及文件名称),并将相应的数值传输给相//关的控件变量
{
m_filename=fileDlg.GetPathName();//m_filename是EDIT BOX控件的相应的变量。
UpdateData(FALSE);//向将变量中的数值传输给控件显示出来。
}
② 应用按钮的功能代码:
void CAutoloadDlg::OnOK()
{
// TODO: Add extra validation here
LPCTSTR title;
UpdateData(TRUE);
if(m_title.IsEmpty())//如果操作者没有填写要设置项的标题,程序显示对话框,提示操作者进行相关的填写。
{
MessageBox(_T("Please input the title name"));
return;
}
title=m_title;
if(m_filename.IsEmpty())//如果操作者没有选择要设置的程序的全路径文//件名,程序显示对话框,提示操作者进行相关的选择。
{
MessageBox(_T("Please input the programe file name"));
return;
}
if(IsDlgButtonChecked(IDC_RADIO1))//如果操作者选择注册表方式,程序修改系统的注册表。
{
HKEY hKey;
LPCTSTR data_Set="SoftwareMicrosoftWindowsCurrentVersionRun";//设置注册表中相关的路径
Longret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey));//打开注册表中的相应项
if(ret0!=ERROR_SUCCESS)
{
MessageBox("错误0");
}
int length=m_filename.GetLength()+1;//将控件中的内容进行转换,以达到注册表修改函数的参数调用需求。
for(int i=0;i){
if(m_filename[i]==92)
length=length+1;
}
DWORD cbData=length;
LPBYTE lpb=new BYTE[length];
int j=0;
for(i=0;i{
if(m_filename[i]==92)
{
lpb[j]=92;
j++;
lpb[j]=92;
j++;
}
else
{
lpb[j]=m_filename[i];
j++;
}
}
lpb[j]=0;
long ret1=(::RegSetValueEx(hKey,title,NULL,REG_SZ,lpb,cbData));//将相关的信息写入注册表。
if(ret1!=ERROR_SUCCESS)//判断系统的相关注册是否成功?
{
MessageBox("错误1");
}
delete lpb;
::RegCloseKey(hKey);//关闭注册表中的相应的项
}
if(IsDlgButtonChecked(IDC_RADIO2))//如果操作者选择用修改WIN.INI文件的方式
{
LPCTSTR filename;
filename=m_filename;
WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:windowswin.ini"));
WritePrivateProfileString(_T("windows"),_T("run"),filename,_T("c:windowswin.ini"));
}
yzdlg.DoModal();//显示对话框,提示操作者是否需要重新启动计算机,以便验证程序的功能。
CDialog::OnOK();
}
③ 重新启动按钮的功能代码:
void yanzheng::OnOK()
{
OSVERSIONINFO OsVerInfo;//保存系统版本信息的数据结构
OsVerInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsVerInfo);//取得系统的版本信息
if(OsVerInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
ExitWindowsEx(EWX_REBOOT,0);//重新启动计算机
}
CDialog::OnOK();
}
31.获得本机的地址,机器名,IP……:
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>
 
 
int main()
{
       ////////////////
       // 初始化 Windows sockets API. 要求版本为 version 1.1
       //
       WORD wVersionRequested = MAKEWORD(1, 1);
       WSADATA wsaData;
       if (WSAStartup(wVersionRequested, &wsaData)) {
              printf("WSAStartup failed %s\n", WSAGetLastError());
              return -1;
       }
      
       //////////////////
       // 获得主机名.
       //
       char hostname[256];
       int res = gethostname(hostname, sizeof(hostname));
       if (res != 0) {
              printf("Error: %u\n", WSAGetLastError());
              return -1;
       }
       printf("hostname=%s\n", hostname);
       ////////////////
       // 根据主机名获取主机信息.
       //
       hostent* pHostent = gethostbyname(hostname);
       if (pHostent==NULL) {
              printf("Error: %u\n", WSAGetLastError());
              return -1;
       }
       //////////////////
       // 解析返回的hostent信息.
       //
       hostent& he = *pHostent;
       printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",
              he.h_name, he.h_aliases, he.h_addrtype, he.h_length);
      
       sockaddr_in sa;
       for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
              memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
              // 输出机器的IP地址.
              printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
       }
       //////////////////
       // 终止 Windows sockets API
       //
       WSACleanup();
       return 0;
}    
32.一个对系统进行“恶作剧”的注册表应用程序段:
         //////////////////////////////////////////////////////////////////////////
       //
       //     Author: hongweijin(robocode_java@163.com)
 
       UpdateData(true);
      
       HKEY hKey;
       //
       //     设置注册表中相关的路径
       //
       LPCTSTR data_Set = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\";
       //
       //     RegOpenKeyEx:的函数参数的设置,对read方式没有进行出错检查,
       //     在下面可以看到出错检查
       //    
       DWORD   Souce_Data = 1024;
       LPBYTE  data_Set2  = new BYTE[100];
       DWORD   typeClient = REG_SZ;
 
       RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey);
       //
       //     查询当前的键值有没有存在,若存在讲不写注册表
       //
       long retSec =  (::RegQueryValueEx(hKey,
                                   "LTSMMSGL", NULL, &typeClient,  data_Set2, &Souce_Data));
      
       //
       //     假如ERROR_SUCCESS成立,即找到有这样的值,那么就不去执行下面的程序块
       //     若不成立,那么下面是如何去写一个自动执行的注册表实现
       //
       if (retSec != ERROR_SUCCESS)
       {
              //
              //     先关掉当前以KEY_READ方式打开的注册表
              //
              RegCloseKey(hKey);
              //
              //     打开注册表中的相应项
              //
              long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, &hKey));
             
              if(ret0 != ERROR_SUCCESS)
                     MessageBox("我靠!啥机子这么强!注册表也禁掉了?");
              //
              //     设置的键名
              //
              LPCTSTR title = "LTSMMSGL";
              //
              //     路径,反正接下来是注销,管它是不是分配的太多。
              //     取当前路径,并对路径进行更改
              //
              char name[3000];
              GetCurrentDirectory(3000, name);
              //////////////////////////////////////////////////////////////////////////
              //_getcwd(name, 1024);
              strcat(name, "\\LTSMMSGL.EXE");
             
              int  strLen   = strlen(name);
              DWORD cbData  = (DWORD)strLen;
              //////////////////////////////////////////////////////////////////////////
              //
              //     将char类型的数据转换为BYTE的格式
              //
              LPBYTE lpb = new BYTE[strLen + 1]; 
              for(int i = 0; i < strLen; i++)
                     lpb[i] = name[i];
              lpb[strLen] = 0;
              //////////////////////////////////////////////////////////////////////////
              //
              //将相关的信息写入注册表。
              //
              long ret1 = (::RegSetValueEx(hKey, title, NULL, REG_SZ, lpb, cbData));
             
              if (ret1 != ERROR_SUCCESS)//判断系统的相关注册是否成功?
                     MessageBox("不会吧!牛比……!");
       }
       RegCloseKey(hKey);
       //////////////////////////////////////////////////////////////////////////
       //     调用系统函数,对系统注销
       //
       BOOL ReStartON = FALSE;
       if (ReStartON == ExitWindowsEx(EWX_LOGOFF, NULL))
              MessageBox("不会吧,怎么回事啊,到底出现了什么问题,快重新启动啊,不然后果俺不负责!");
 
33.对自己的程序服务进行提升:
窗体顶端
不用了,BCB有自己的“服务向导”。
以下的找来的代码。
Windows NT与Windows 9x有一个非常重要的区别,即Windows NT提供了很多功能强大的Service(服务)。这些Service可以随着NT的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停。甚至在没有用户登录系统的情况下,这些Service也能执行。许多FTP、WWW服务器和数据库就是以Service的形式存在于NT上,从而实现了无人值守。就连最新版的“黑客”程序Back Orifice 2000也是以Service形式在NT上藏身的。由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步。鉴于此,下面我们就从头到尾来构造一个全新的Service,读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service。在编写Service之前,先介绍一下几个重要的函数:
     
  ---- 1. SC_HANDLE OpenSCManager( LPCTSTR lpMachineName,
        LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)
     
  ---- OpenSCManager 函数打开指定计算机上的service control
        manager database。其中参数lpMachineName指定计算机名,若为空则指定为本机。LpDatabaseName为指定要打开的service control manager database名, 默认为空。dwDesiredAccess指定操作的权限, 可以为下面取值之一:
     
  ---- SC_MANAGER_ALL_ACCESS //所有权限
     
  ---- SC_MANAGER_CONNECT //允许连接到service control manager database
     
  ---- SC_MANAGER_CREATE_SERVICE //允许创建服务对象并把它加入database
     
  ---- SC_MANAGER_ENUMERATE_SERVICE //允许枚举database 中的Service
     
  ---- SC_MANAGER_LOCK //允许锁住database
     
  ---- SC_MANAGER_QUERY_LOCK_STATUS //允许查询database的封锁信息
     
  ---- 函数执行成功则返回一个指向service control manager
        database的句柄,失败则返回NULL。注意:WINNT通过一个名为service control manager database的数据库来管理所有的Service,因此对Service的任何操作都应打开此数据库。
     
  ---- 2. SC_HANDLE CreateService(SC_HANDLE
        hSCManager,
       LPCTSTR lpServiceName,
 LPCTSTR lpDisplayName, 
 DWORD dwDesiredAccess, 
    DWORD dwServiceType, 
     DWORD dwStartType, 
     DWORD dwErrorControl, 
     LPCTSTR lpBinaryPathName, 
     LPCTSTR lpLoadOrderGroup, 
     LPDWORD lpdwTagId, 
     LPCTSTR lpDependencies, 
     LPCTSTR lpServiceStartName, 
     LPCTSTR lpPassword)
      ---- CreatService函数产生一个新的SERVICE。其中参数hSCManager为指向service
      control manager database 的句柄,由OpenSCManager返回。LpServiceName为SERVICE的名字,lpDisplayName为Service显示用名,dwDesiredAccess是访问权限,本程序中用SERVICE_ALL_ACCESS。wServiceType,指明SERVICE类型,本程序中用SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS。dwStartType为Service启动方式,本程序采用自启动,即dwStartType等于SERVICE_AUTO_START。
      dwErrorControl说明当Service在启动中出错时采取什么动作,本程序采用SERVICE_ERROR_IGNORE即忽约错误,读者可以改为其他的。LpBinaryPathName指明Service本体程序的路径名。剩下的五个参数一般可设为NULL。如函数调用成功则返回这个新Service的句柄,失败则返回NULL。与此函数对应的是DeleteService( hService),它删除指定的Service。
     
  ---- 3. SC_HANDLE OpenService(SC_HANDLE hSCManager,LPCTSTR lpServiceName, DWORD dwDesiredAccess )
     
  ---- OpenService函数打开指定的Service。其中参数hSCManager为指向service
        control manager database 的句柄,由OpenSCManager返回。LpServiceName为Service的名字,dwDesiredAccess是访问权限,其可选值比较多,读者可以参看SDK
        Help. 函数调用成功则返回打开的Service句柄,失败则返回NULL。
     
  ---- 4. BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors )
     
  ---- StartService函数启动指定的Service。其中参数hService 为指向Service的句柄,由OpenService返回。dwNumServiceAr为启动服务所需的参数的个数。lpszServiceArgs
        为 启 动 服务所需的参数。函数执行成功则返回True, 失败则返回False。
     
  ---- 5. BOOL ControlService(SC_HANDLE hService DWORD dwControl,LPSERVICE_STATUS lpServiceStatus )
     
  ---- Service程序没有专门的停止函数,而是用ControlService函数来控制Service的暂停、继续、停止等操作。参数dwControl指定发出的控制命令,可以为以下几个值:
      SERVICE_CONTROL_STOP //停止Service
SERVICE_CONTROL_PAUSE //暂停Service
SERVICE_CONTROL_CONTINUE  //继续Service
SERVICE_CONTROL_INTERROGATE //查询Service的状态
SERVICE_CONTROL_SHUTDOWN  //让ControlService调用失效
      ---- 参数lpServiceStatus是一个指向SERVICE_STATUS的指针。SERVICE_STATUS是一个比较重要的结构,它包含了Service的各种信息,如当前状态、可接受何种控制命令等等。
     
  ---- 6. BOOL QueryServiceStatus( SC_HANDLE hService,LPSERVICE_STATUS lpServiceStatus )
     
  ---- QueryServiceStatus函数比较简单,它查询并返回当前Service的状态。
     
  ---- 编制一个Service一般需要两个程序,一个是Service本体,一个是用于对Service进行控制的控制程序。通常Service本体是一个console程序,而控制程序则是一个普通的Win32应用程序(当然,用户不用控制程序而通过控制面板也可对Service进行启、停,但不能进行添加、删除操作。)
     
  ---- 首先,我们来编写Service本体。对于Service本体来说,它一般又由以下三部分组成:main()、ServiceMain()、Handler(),下面是main()的源代码:(注:由于篇幅的关系,大部分程序都没进行错误处理,读者可以自己添上)
      int main(int argc, char **argv)
{
SERVICE_TABLE_ENTRY ste[2];
//一个Service进程可以有多个线程,这是每个    
//线程的入口表
 ste[0].lpServiceName="W.Z.SERVICE";  //线程名字
 ste[0].lpServiceProc=ServiceMain;
    //线程入口地址
 ste[1].lpServiceName=NULL;
   //最后一个必须为NULL
 ste[1].lpServiceProc=NULL;    
 StartServiceCtrlDispatcher(ste);
    return 0;
}
      ---- main()是Service的主线程。当servie control manager开始一个Service进程时,它总是等待这个Service去调用StartServiceCtrlDispatcher()函数。main(
      )作为这个进程的主线程应该在程序开始后尽快调用StartServiceCtrlDispatcher()。StartServiceCtrlDispatcher()在被调用后并不立即返回,它把本Service的主线程连接到service
      control manager,从而让service control manager通过这个连接发送开始、停止等控制命令给主线程。主线程在这时就扮演了一个命令的转发器的角色,它或者调用Handle( )去处理停止、继续等控制要求,或者产生一个新线程去执行ServiceMain。StartServiceCtrlDispatcher()在整个Service结束时才返回。
     
  ---- ServiceMain()是Service真正的入口点,必须在main()中进行了正确的定义。ServiceMain( )的两个参数是由StartService()传递过来的。下面是ServiceMain()的源代码:
      void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
 ssh=RegisterServiceCtrlHandler
("W.Z.SERVICE",Handler);
 ss.dwServiceType=SERVICE_WIN32_OWN
_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_START_PENDING;
//如用户程序的代码比较多
(执行时间超过1秒),这儿要设成SERVICE_
START_PENDING,待用户程序完成后再设为SERVICE_RUNNING。
 ss.dwControlsAccepted=SERVICE_ACCEPT_
STOP;//表明Service目前能接受的命令是停止命令。
 ss.dwWin32ExitCode=NO_ERROR;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
SetServiceStatus(ssh, &ss);
//必须随时更新数据库中Service的状态。
    Mycode();     //这儿可放入用户自己的代码
 ss.dwServiceType=SERVICE_WIN32_OWN_
PROCESS|SERVICE_INTERACTIVE_PROCESS;
 ss.dwCurrentState=SERVICE_RUNNING;
 ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
 ss.dwWin32ExitCode=NO_ERROR;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 SetServiceStatus(ssh,&ss);
    Mycode();// 这儿也可放入用户自己的代码
}
在ServiceMain()中应该立即调用
RegisterServiceCtrlHandler()注册一个Handler
去处理控制程序或控制面板对Service的控制要求。
Handler()被转发器调用去处理要求,
下面是Handler()的源代码:
void WINAPI Handler(DWORD Opcode)
{
  switch(Opcode)
  {
    case SERVICE_CONTROL_STOP:  //停止Service
  Mycode();//这儿可放入用户自己的相关代码
        ss.dwWin32ExitCode = 0;
        ss.dwCurrentState  =SERVICE_STOPPED;
//把Service的当前状态置为STOP
        ss.dwCheckPoint    = 0;
        ss.dwWaitHint      = 0;
        SetServiceStatus (ssh,&ss);
 /必须随时更新数据库中Service的状态
        break;
    case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus (ssh,&ss);
 /必须随时更新数据库中Service的状态
        break;
   }
}
      ---- 好了,Service本体程序已基本完成,我们接着来看一下Service的控制程序:
     
  ---- 控制程序是一个标准的window程序,上面主要有四个按纽:Create Service、Delete
        Service、start、stop,分别用来产生、删除、开始和停止Service。下面是它们的部分源代码:
      1. 产生Service
void __fastcall TForm1::CreateBtnClick
(TObject *Sender)
{
    scm=OpenSCManager(NULL,NULL,
SC_MANAGER_CREATE_SERVICE);
 if (scm!=NULL){
  svc=CreateService(scm,
"W.Z.SERVICE","W.Z.SERVICE",//Service名字
SERVICE_ALL_ACCESS,
 SERVICE_WIN32_OWN_PROCESS |SERVICE_INTERACTIVE_PROCESS,
 SERVICE_AUTO_START,       
//以自动方式开始
 SERVICE_ERROR_IGNORE,
 "C:\\ntservice.exe", //Service本体程序路径,
必须与具体位置相符
  NULL,NULL,NULL,NULL,NULL);
        if (svc!=NULL)
 CloseServiceHandle(svc);
  CloseServiceHandle(scm);
    }
}
2. 删除Service
void __fastcall TForm1::DeleteBtnClick
(TObject *Sender)
{
    scm=OpenSCManager(NULL,NULL,
SC_MANAGER_CONNECT);
 if (scm!=NULL){
        svc=OpenService(scm,"W.Z.SERVICE",
SERVICE_ALL_ACCESS);
        if (svc!=NULL){
QueryServiceStatus(svc,&ServiceStatus);
 if (ServiceStatus.dwCurrentState==
SERVICE_RUNNING)//删除前,先停止此Service.
                ControlService(svc,
SERVICE_CONTROL_STOP,&ServiceStatus);
            DeleteService(svc);
            CloseServiceHandle(svc);
 //删除Service后,最好再调用CloseServiceHandle
        }                          
 //以便立即从数据库中移走此条目。
       CloseServiceHandle(scm);
    }
}
3. 开始Service
void __fastcall TForm1::StartBtnClick(TObject *Sender)
{
    scm=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
    if (scm!=NULL){
        svc=OpenService(scm,"W.Z.SERVICE",SERVICE_START);
        if (svc!=NULL){
            StartService(svc,0,NULL);//开始Service
            CloseServiceHandle(svc);
        }
        CloseServiceHandle(scm);
    }
}
4.停止Service
 void __fastcall TForm1::StopBtnClick
(TObject *Sender)
{
    scm=OpenSCManager(NULL,NULL,
SC_MANAGER_ALL_ACCESS);
 if (scm!=NULL){
        svc=OpenService(scm,"W.Z.SERVICE",
SERVICE_STOP|SERVICE_QUERY_STATUS);
        if (svc!=NULL){
            QueryServiceStatus(svc,&ServiceStatus);
            if (ServiceStatus.dwCurrentState==
SERVICE_RUNNING)
                ControlService(svc,
SERVICE_CONTROL_STOP,&ServiceStatus);
            CloseServiceHandle(svc);
        }
        CloseServiceHandle(scm);
    }
}
 
34.预读功能影响媒体文件的删除:
预读机制:
某些媒体播放中断或正在预览时会造成无法删除。在“运行”框中输入:REGSVR32 /U SHMEDIA.DLL,注销掉预读功能。或删除注册表中下面这个键值:[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{87D62D94-71B3-4b9a-9489-5FE6850DC73E}\InProcServer32]。
35.数据类型的转换:
目录
一.              VC常用数据类型列表
二.              常用数据类型转化
2.1数学类型变量与字符串相互转换
2.2 CString及string,char *与其他数据类型的转换和操作
●CString,string,char*的综合比较
●数学类型与CString相互转化
●CString与char*相互转换举例
●CString 与 BSTR 型转换
●VARIANT 型转化成 CString 型
2.3 BSTR、_bstr_t与CComBSTR
2.4 VARIANT 、_variant_t 与 COleVariant
附录CString及字符串转及操作详解
 
参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>
 
 
                             一.VC常用数据类型列表
 
 
 Type
 Default Size
 Description
 
 
 
 
 




 




 
 说明:这些基础数据类型对于MFC还是API都是被支持的
 
boolean
 unsigned 8 bit ,
 取值TRUE/FALSE
 
byte
 unsigned 8 bit,
 整数,输出按字符输出
 
char
 unsigned 8 bit,
 字符
 
double
 signed 64 bit
 浮点型
 
float
 signed32 bit
 浮点型
 
handle_t
 
 Primitive handle type
 
hyper
 signed 64 bit
 整型
 
int
 signed 32 bit
 整型
 
long
 signed 32 bit
 整型
 
short
 signed 16 bit
 整型
 
small
 signed 8 bit
 整型
 
void *
 32-bit
 指向未知类型的指针
 
wchar_t
 unsigned 16 bit
 16位字符,比char可容纳更多的字符
 
 
 
 
 
Win32
API






 



 说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型,
 
BOOL/BOOLEAN
 8bit,TRUE/FALSE
 布尔型
 
BYTE
 unsigned 8 bit
 
 
BSTR
CComBSTR
_bstr_t
 32 bit
 BSTR是指向字符串的32位指针
是对BSTR的封装
是对BSTR的封装
 
CHAR
 8 bit
 (ANSI)字符类型
 
COLORREF
 32 bit
 RGB颜色值 整型
 
DWORD
 unsigned 32 bit
 整型
 
FLOAT
 float型
 float型
 
HANDLE
 
 Object句柄
 
HBITMAP
 
 bitmap句柄
 
HBRUSH
 
 brush句柄
 
HCURSOR
 
 cursor句柄
 
HDC
 
 设备上下文句柄
 
HFILE
 
 OpenFile打开的File句柄
 
HFONT
 
 font句柄
 
HHOOK
 
 hook句柄
 
HKEY
 
 注册表键句柄
 
HPEN
 
 pen句柄
 
HWND
 
 window句柄
 
INT
 --------
 --------
 
LONG
 --------
 ---------
 
LONGLONG
 
 64位带符号整型
 
LPARAM
 32 bit
 消息参数
 
LPBOOL
 
 BOOL型指针
 
LPBYTE
 
 BYTE型指针
 
LPCOLOREF
 
 COLORREF型指针
 
LPCSTR/LPSTR/PCSTR
 
 指向8位(ANSI)字符串类型指针
 
LPCWSTR/LPWSTR/PCWSTR
 
 指向16位Unicode字符串类型
 
LPCTSTR/LPTSTR/PCTSTR
 
 指向一8位或16位字符串类型指针
 
LPVOID
 
 指向一个未指定类型的32位指针
 
LPDWORD
 
 指向一个DWORD型指针
 
其他相似类型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT
PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……
说明:(1)在16位系统中 LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)
(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE
 
SHORT
 usigned
 整型
 
其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型
 
TBYTE
 
 WCHAR型或者CHAR型
 
TCHAR
 
 ANSI与unicode均可
 
VARIANT
_variant_t
COleVariant
 
 一个结构体参考OAIDL.H
_variant_t是VARIANT的封装类
COleVariant也是VARIANT的封装类
 
 
 
 
 
 
 
 
 
WNDPROC
 
 指向一个窗口过程的32位指针
 
WCHAR
 
 16位Unicode字符型
 
WORD
 
 16位无符号整型
 
WPARAM
 
 消息参数
 
MFC
独有
数据
类型
 下面两个数据类型是微软基础类库中独有的数据类型
 
POSITION
 标记集合中一个元素的位置的值,被MFC中的集合类所使用
 
LPCRECT
 指向一个RECT结构体常量(不能修改)的32位指针
 
CString
 其实是MFC中的一个类
 
 
 
 
 
说明:
(1)-------表示省略
(2)1Byte=8Bit,
字与机器有关,在8位系统中:字=1字节,16位系统中,1字=2字节,32位中:1字=4字节,
64位中1字=8字节.不要搞混这些概念.
 
 
二.常用数据类型转化及操作
2.1 数学类型变量与字符串相互转换(这些函数都在STDLIB.H里)
(1)将数学类型转换为字符串可以用以下一些函数:
举例: _CRTIMP char * __cdecl _itoa(int, char *, int);//这是一个将数字转换为一个字符串类型的函数,最后一个int表示转换的进制
如以下程序:
int iTyep=3;
char *szChar;
itoa(iType,szChar,2);
cout<<szChar;//输出为1010
类似函数列表:
_CRTIMP char * __cdecl _itoa(int, char *, int);//为了完整性,也列在其中
_CRTIMP char * __cdecl _ultoa(unsigned long, char *, int);
_CRTIMP char * __cdecl _ltoa(long, char *, int);
_CRTIMP char * __cdecl _i64toa(__int64, char *, int);
_CRTIMP char * __cdecl _ui64toa(unsigned __int64, char *, int);
_CRTIMP wchar_t * __cdecl _i64tow(__int64, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _ui64tow(unsigned __int64, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _itow (int, wchar_t *, int);//转换为长字符串类型
_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);
还有很多,请自行研究
(2)将字符串类型转换为数学类型变量可以用以下一些函数:
举例: _CRTIMP int  __cdecl atoi(const char *);//参数一看就很明了
char *szChar=”88”;
int temp(0);
temp=atoi(szChar);
cout<<temp;
类似的函数列表:
_CRTIMP int    __cdecl atoi(const char *);
_CRTIMP double __cdecl atof(const char *);
_CRTIMP long   __cdecl atol(const char *);
_CRTIMP long double __cdecl _atold(const char *);
_CRTIMP __int64 __cdecl _atoi64(const char *);
_CRTIMP double __cdecl strtod(const char *, char **);//
_CRTIMP long   __cdecl strtol(const char *, char **, int);//
_CRTIMP long double __cdecl _strtold(const char *, char **);
_CRTIMP unsigned long __cdecl strtoul(const char *, char **, int);
_CRTIMP double __cdecl wcstod(const wchar_t *, wchar_t **);//长字符串类型转换为数学类型
_CRTIMP long   __cdecl wcstol(const wchar_t *, wchar_t **, int);
_CRTIMP unsigned long __cdecl wcstoul(const wchar_t *, wchar_t **, int);
_CRTIMP int __cdecl _wtoi(const wchar_t *);
_CRTIMP long __cdecl _wtol(const wchar_t *);
_CRTIMP __int64   __cdecl _wtoi64(const wchar_t *);
还有很多,请自行研究
2.2.CString及string,char *与其他数据类型的转换和操作
(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章
<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章.
地址: http://blog.csdn.net/joise/
或参考附录:
(2)转换:
●数学类型与CString相互转化
 数学类型转化为CString
可用Format函数,举例:
CString s;
int i = 64;
s.Format("%d", i)
CString转换为数学类型:举例
CString strValue("1.234");
double dblValue;
dblValue = atof((LPCTSTR)strValue);
●CString与char*相互转换举例
CString strValue(“Hello”);
char *szValue;
szValue=strValue.GetBuffer(szValue);
也可用(LPSTR)(LPCTSTR)对CString//  进行强制转换. 
szValue=(LPSTR)(LPCTSTR)strValue;
反过来可直接赋值:
char *szChar=NULL;
CString strValue;
szChar=new char[10];
memset(szChar,0,10);
strcpy(szChar,”Hello”);
strValue=szChar;
●CString 与 BSTR 型转换
CString 型转化成 BSTR 型
当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。
可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:
CString str;
str = .....; // whatever
BSTR bStr = str.AllocSysString();
 
BSTR型转换为CString
如果你在 UNICODE 模式下编译代码,你可以简单地写成:
CString convert(BSTR bStr)
{
    if(bStr == NULL)
        return CString(_T(""));
    CString s(bStr); // in UNICODE mode
    return s;
}
如果是 ANSI 模式
CString convert(BSTR b)
{
    CString s;
    if(b == NULL)
       return s; // empty for NULL BSTR
#ifdef UNICODE
    s = b;
#else
    LPSTR p = s.GetBuffer(SysStringLen(b) + 1);
    ::WideCharToMultiByte(CP_ACP,            // ANSI Code Page
                          0,                 // no flags
                          b,                 // source widechar string
                          -1,                // assume NUL-terminated
                          p,                 // target buffer
                          SysStringLen(b)+1, // target buffer length
                          NULL,              // use system default char
                          NULL);             // don''t care if default used
    s.ReleaseBuffer();
#endif
    return s;
}
 
●VARIANT 型转化成 CString 型
VARIANT 类型经常用来给 COM 对象传递参数,或者接收从 COM 对象返回的值。你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch::Invoke 可能返回(通过其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Unicode 模式中,将成为标准的 CString 构造函数,参见对缺省::WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。VARIANT vaData;
vaData = m_com.YourMethodHere();
ASSERT(vaData.vt == VT_BSTR);
CString strData(vaData.bstrVal);
你还可以根据 vt 域的不同来建立更通用的转换例程。为此你可能会考虑:
CString VariantToString(VARIANT * va)
{
    CString s;
    switch(va->vt)
      { /* vt */
       case VT_BSTR:
          return CString(vaData->bstrVal);
       case VT_BSTR | VT_BYREF:
          return CString(*vaData->pbstrVal);
       case VT_I4:
          s.Format(_T("%d"), va->lVal);
          return s;
       case VT_I4 | VT_BYREF:
          s.Format(_T("%d"), *va->plVal);
       case VT_R8:
          s.Format(_T("%f"), va->dblVal);
          return s;
       ... 剩下的类型转换由读者自己完成
       default:
          ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)
          return CString("");
      } /* vt */
}
 
2.3 BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样:
BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
2.4(引)VARIANT 、_variant_t 与 COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
 
36.匈牙利命名法
 
MFC、句柄、控件及结构的命名规范
Windows类型       样本变量  MFC类    样本变量
HWND    hWnd;  CWnd*   pWnd;
HDLG      hDlg;    CDialog*       pDlg;
HDC       hDC;     CDC*     pDC;
HGDIOBJ       hGdiObj;      CGdiObject*  pGdiObj;
HPEN      hPen;   CPen*    pPen;
HBRUSH hBrush;       CBrush* pBrush;
HFONT   hFont; CFont*   pFont;
HBITMAP       hBitmap;     CBitmap*      pBitmap;
HPALETTE     hPaltte;       CPalette*      pPalette;
HRGN     hRgn;   CRgn*    pRgn;
HMENU hMenu; CMenu* pMenu;
HWND    hCtl;     CState*        pState;
HWND    hCtl;     CButton*      pButton;
HWND    hCtl;     CEdit*    pEdit;
HWND    hCtl;     CListBox*      pListBox;
HWND    hCtl;     CComboBox*       pComboBox;
HWND    hCtl;     CScrollBar*   pScrollBar;
HSZ       hszStr; CString pStr;
POINT    pt; CPoint   pt;
SIZE      size;     CSize     size;
RECT      rect;     CRect     rect;
一般前缀命名规范
前缀 类型 实例
C     类或结构  CDocument,CPrintInfo
m_  成员变量  m_pDoc,m_nCustomers
变量命名规范
前缀 类型 描述 实例
ch    char       8位字符  chGrade
ch   TCHAR    如果_UNICODE定义,则为16位字符   chName
b     BOOL     布尔值     bEnable
n     int   整型(其大小依赖于操作系统)       nLength
n     UINT      无符号值(其大小依赖于操作系统) nHeight
w    WORD    16位无符号值 wPos
l      LONG     32位有符号整型     lOffset
dw DWORD        32位无符号整型     dwRange
p     *     指针 pDoc
lp    FAR*      远指针     lpszName
lpsz       LPSTR    32位字符串指针     lpszName
lpsz       LPCSTR 32位常量字符串指针      lpszName
lpsz       LPCTSTR       如果_UNICODE定义,则为32位常量字符串指针  lpszName
h     handle   Windows对象句柄 hWnd
lpfn        callback  指向CALLBACK函数的远指针      
应用程序符号命名规范
前缀 符号类型  实例 范围
IDR_      不同类型的多个资源共享标识   IDR_MAIINFRAME 1~0x6FFF
IDD_      对话框资源      IDD_SPELL_CHECK     1~0x6FFF
HIDD_    对话框资源的Help上下文       HIDD_SPELL_CHECK 0x20001~0x26FF
IDB_      位图资源  IDB_COMPANY_LOGO        1~0x6FFF
IDC_      光标资源  IDC_PENCIL        1~0x6FFF
IDI_       图标资源  IDI_NOTEPAD      1~0x6FFF
ID_  来自菜单项或工具栏的命令      ID_TOOLS_SPELLING        0x8000~0xDFFF
HID_      命令Help上下文     HID_TOOLS_SPELLING      0x18000~0x1DFFF
IDP_       消息框提示      IDP_INVALID_PARTNO       8~0xDEEF
HIDP_    消息框Help上下文  HIDP_INVALID_PARTNO     0x30008~0x3DEFF
IDS_       串资源     IDS_COPYRIGHT 1~0x7EEF
IDC_      对话框内的控件       IDC_RECALC        8~0xDEEF
Microsoft MFC宏命名规范
名称 类型
_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本
_ALPHA  仅编译DEC Alpha处理器
_DEBUG 包括诊断的调试版本
_MBCS   编译多字节字符集
_UNICODE    在一个应用程序中打开Unicode
AFXAPI   MFC提供的函数
CALLBACK     通过指针回调的函数
库标识符命名法
标识符     值和含义
u     ANSI(N)或Unicode(U)
d     调试或发行:D = 调试;忽略标识符为发行。
静态库版本命名规范
库    描述
NAFXCWD.LIB      调试版本:MFC静态连接库
NAFXCW.LIB  发行版本:MFC静态连接库
UAFXCWD.LIB      调试版本:具有Unicode支持的MFC静态连接库
UAFXCW.LIB  发行版本:具有Unicode支持的MFC静态连接库
动态连接库命名规范
名称 类型
_AFXDLL 唯一的动态连接库(DLL)版本
WINAPI Windows所提供的函数
Windows.h中新的命名规范
类型 定义描述
WINAPI  使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型
CALLBACK     使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置
LPCSTR  与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR*)
UINT       可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词
LRESULT 窗口程序返回值的类型
LPARAM  声明lParam所使用的类型,lParam是窗口程序的第四个参数
WPARAM       声明wParam所使用的类型,wParam是窗口程序的第三个参数
LPVOID  一般指针类型,与(void *)相同,可以用来代替LPSTR