下斷點時候當前代碼下斷代碼不匹配
在工具->選項->調試->常規去掉要求源文件與原始版本完全匹配
在重新編譯時候重新生成表一些錯,比如無法貸款數據庫等
先清理解決方案,在重新生成,如果還不行,就關閉項目,刪除項目的.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跟服務通信接口-》跟通信驅動接口-》清除模塊
個人開發從底層向上
先設計接口,從核心到周邊,
源碼分析
從通信中樞往外圍看
關鍵通信加密。