1.
此時出現如下圖視窗介面,在此介面中選擇」服務(exe)「,然後選擇完成按鈕。
在接下來的視窗中選擇確定按鈕。
則vc完成嚮導並生成相應**(效果如下)。 2
程式的進入點是全域性函式_twinmain, 仔細看一下這個函式,我們會發現當我們執行程式時,可以加上引數,例如: winsvr /regserver 或者 winsvr -regserver,這個是用來本地伺服器註冊(register as local s register as service erver)。
其中winsvr / service 或者 winsvr -service,這個是服務的註冊(register as service);winsvr /unregserver 或者 winsvr -unregserver ,這個是服務的刪除。
所以,當我們寫好了服務程式,只要執行的時候加上引數 service ,這個時候在scm中就會看到我們的服務了。
每次編碼後測試都要在命令列中加引數執行服務才可以在scm中列出來這樣很麻煩,因此可以採用如下方式來處理:選擇vc ide的選單工程 -> 設定, 再選擇自定義組建面板(custom build)(如下圖所示)
在"$(targetpath)" /regserver的下面加上:"$(targetpath)" /service,這樣當我們每次編碼後編譯程式,就不用再在命令列中去加引數執行我們的服務程式完成服務的註冊了。
同時通過介面我們也看到,嚮導為我們建立了乙個類:cservicemodule,全域性變數_module就是這個類的例項。
init():這個函式用於完成一些初始化工作;
run():這個函式就是服務開始執行後的內容,我們接下來要修改的內容也就是從這裡入手。
sc_handle hservice = ::createservice(
hscm, m_szservicename, m_szservicename,
service_all_access, service_win32_own_process,
service_demand_start, service_error_normal,
szfilepath, null, null, _t("rpcss/0"), null, null);
注意:如果服務中啟動的程式具有視窗(即具有互動功能則要求使用如下**)
sc_handle hservice = ::createservice(
hscm, m_szservicename, m_szservicename,
service_all_access, service_win32_share_process | service_interactive_process,
service_auto_start, service_error_normal,
szfilepath, null, null, _t("rpcss/0"), null, null);
這個createservice函式原先如下:
sc_handle createservice(
sc_handle hscmanager, // handle to scm database
lpctstr lpservicename, // name of service to start
lpctstr lpdisplayname, // display name
dword dwdesiredaccess, // type of access to service
dword dwservicetype, // type of service
dword dwstarttype, // when to start service
dword dwerrorcontrol, // severity of service failure
lpctstr lpbinarypathname, // name of binary file
lpctstr lploadordergroup, // name of load ordering group
lpdword lpdwtagid, // tag identifier
lpctstr lpdependencies, // array of dependency names
lpctstr lpservicestartname, // account name
lpctstr lppassword // account password
); 第六個引數是服務的啟動型別。
service_demand_start是手動啟動,service_auto_start是自動啟動。
第十乙個引數是服務的依存關係,比如說服務的啟動想要依存sql server的啟動,那我們可以把這個引數寫成:
_t("mssqlserver/0");
如果我們寫的服務不依存於其他的任何服務,那我們就將此引數設定為null就可以了。
接下來我們實現我們需要實現的業務。
首先,我們在類cservicemodule中找到run函式,並在run函式中找到以下**:
msg msg;
while (getmessage(&msg, 0, 0, 0))
dispatchmessage(&msg);
並在此**前加入自己的**,我這裡加入的**:
customfunc1()。
這裡對應不同應用有不同寫法:
1、如果要啟動乙個視窗進行互動,則**如下:
定義兩個成員函式customfunc1和customfunc2
void cservicemodule::customfunc1()
else
else
else
else
else}}
}}}bool cservicemodule::customfunc2()
hdeskcurrent = getthreaddesktop(getcurrentthreadid());
if (hdeskcurrent == null)
//開啟winsta0
hwinsta = openwindowstation("winsta0", false,
winsta_accessclipboard |
winsta_accessglobalatoms |
winsta_createdesktop |
winsta_enumdesktops |
winsta_enumerate |
winsta_exitwindows |
winsta_readattributes |
winsta_readscreen |
winsta_writeattributes);
if (hwinsta == null)
if (!setprocesswindowstation(hwinsta))
//開啟desktop
hdesk = opendesktop("default", 0, false,
desktop_createmenu |
desktop_createwindow |
desktop_enumerate |
desktop_hookcontrol |
desktop_journalplayback |
desktop_journalrecord |
desktop_readobjects |
desktop_switchdesktop |
desktop_writeobjects);
if (hdesk == null)
setthreaddesktop(hdesk);
customfunc1();
if (!setprocesswindowstation(hwinstacurrent))
return false;
if (!setthreaddesktop(hdeskcurrent))
return false;
if (!closewindowstation(hwinsta))
return false;
if (!closedesktop(hdesk))
return false;
return true;}2、
無互動視窗,則**如下:
void cservicemodule::customfunc1()
現在可以編譯並執行程式了。
此時會編譯時會報告乙個錯誤:'cstring' : undeclared identifier。
這時需要檢視工程的一些設定:
選單工程->設定 ,常規面板,預設的設定是:使用mfc作為靜態連線庫。如果是這個設定則做如下工作:
然後我們開啟stdafx.h檔案,並找到#include 位置,並在它之前加入#include 。重新編譯可以了。
如果需要修改出現在scm中的服務名,可以在工程中找到資源檔案中的ids_servicename項的內容就可以了。
注意:編譯好了的程式需要在控制台中輸入如下指令
1、註冊服務
winsvr -/regserver
winsvr -/service //此條指令十分重要,如果不執行則在scm中是看不到此服務的
2、登出服務
winsvr -/unregserver
vc6 0 除錯小結
現在都用vs2008了,vc6的速度還是很懷念,來個小結吧。斷點相關快捷鍵 1.f9在當前游標所在的行下斷點,如果當前行已經有斷點,則取消斷點.f5除錯狀態執行程式,程式執行到有斷點的地方會停下來.f10單步執行程式.ctrl f10執行到游標所在行.f11和f10的區別是,如果當前執行語句是函式呼...
VC 6 0遠端除錯
先明確下概念,遠端除錯嘛,自然是兩個機器之間除錯。程式執行在目標機器上,偵錯程式執行在本機。當然,目標機器上還是要有少許輔助程式才能跟本機的偵錯程式connect上,以便通訊。一般來說,只需要copy四個檔案到目標機器上就行了 msvcmon.exe dm.dll tln0t.dll和msdis11...
vc6 0記憶體洩露
新建記憶體洩露定位類cmemleaks,所有的檔案都需要包含memleaks.h檔案,故而將其放置在stdafx.h檔案中。cpp檔案如下 memleaks.cpp implementation of the cmemleaks class.include stdafx.h include meml...