下断点时候当前代码下断代码不匹配
在工具->选项->调试->常规去掉要求源文件与原始版本完全匹配
在重新编译时候重新生成表一些错,比如无法贷款数据库等
先清理解决方案,在重新生成,如果还不行,就关闭项目,删除项目的.ncb文件,然后重新生成。
杂项
注意相对路径,另外做产品一般使用Unicode,不要用多字节,代码生成一步用MT或MTd。
优化
产品级的项目尽量避免内嵌汇编。如果一定要记得禁用优化。
IDE的生成窗口被关掉
不小心关了选择编译平台时候可以点击
如图选被关掉了,最后选重排命令确定
服务程序标准框架
一个标准服务需要有如下:
入口点有代码
SERVICE_TABLE_ENTRY dispatchTable[]=
{
{ST,(LPSERVICE_MAIN_FUNCTION)Service_Main},{ NULL,NULL}//服务名,入口程序
};
if(!StartServiceCtrlDispatcher(dispatchTable))//服务处理分发例程
服务主函数
void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
Sleep(20000);
//下面全局变量代码规范一般加前缀g_,主状态
ssStatus.dwServiceType = SERVICE_WIN32; //指明可执行文件类型
ssStatus.dwCurrentState = SERVICE_START_PENDING; //指明服务当前状态
ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; //指明服务接受何种控制
ssStatus.dwWin32ExitCode = 0;
ssStatus.dwServiceSpecificExitCode = 0;
ssStatus.dwCheckPoint = 0;
ssStatus.dwWaitHint = 0;
//注册服务控制处理函数
sshStatusHandle=RegisterServiceCtrlHandler(ST, Service_Ctrl);
//如果注册失败
if(!sshStatusHandle)
{
goto cleanup;
return;
}
//更新服务状态
if(!ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, TIMEOUT))
goto cleanup; //更新服务状态失败则转向 cleanup
ServiceStart(dwArgc,lpszArgv);
return;
cleanup:
//把服务状态更新为 SERVICE_STOPPED,并退出。
if(sshStatusHandle)
ReportStatusToSCMgr(SERVICE_STOPPED, GetLastError(), 0);
}
还要有服务控制函数
//控制处理程序函数
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
//处理控制请求码
switch(dwCtrlCode)
{
case SERVICE_CONTROL_STOP: //先更新服务状态为 SERVICDE_STOP_PENDING,再停止服务。
ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 500);
ServiceStop();
return;
case SERVICE_CONTROL_PAUSE: //暂停服务
ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
ServicePause();
ssStatus.dwCurrentState=SERVICE_PAUSED;
return;
case SERVICE_CONTROL_CONTINUE: //继续服务
ReportStatusToSCMgr(SERVICE_CONTINUE_PENDING, NO_ERROR, 500);
ServiceContinue();
ssStatus.dwCurrentState=SERVICE_RUNNING;
return;
case SERVICE_CONTROL_INTERROGATE: //更新服务状态
break;
default: //无效控制码
break;
}
ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
}
注意点:改变服务状态ReportStatusToSCMgr
编写流程
接口设计从顶向下
gui-》gui跟服务通信接口-》跟通信驱动接口-》清除模块
个人开发从底层向上
先设计接口,从核心到周边,
源码分析
从通信中枢往外围看
关键通信加密。