2008年的时候用VC6.0编译的一个简单的Windows服务程序,能接收加密锁的插拔事件。当插上加密锁的时候,服务程序就运行一个记事本程序。在命令行窗口中执行sc命令可以安装和卸载服务,sc.exe是强大的windows服务管理工具,它在C:\Windows\System32目录下。
安装服务 -------------------------- sc create _TEST type= interact type= own start= auto binpath= E:\qqq\CheckDog.exe
在服务管理器中的名字是“_Test”,和桌面交互,开机自启动,服务程序的路径是E:\qqq\CheckDog.exe,需要注意“=”号后面有一个空格。
卸载服务 ------------------------- sc delete _TEST
运行服务 ------------------------ sc start _TEST
下面是全部源代码,基本上没有多余的逻辑: #include <windows.h> #include "Ry4S.h"
SERVICE_STATUS g_ss = {0}; SERVICE_STATUS_HANDLE g_ssh; bool DogExistFlag = false;
//接收启动停止的命令 VOID WINAPI ControlHandler(DWORD fdwControl) { DbgPrintf("ControlHandler(%d)", fdwControl); if(fdwControl == SERVICE_CONTROL_STOP) { DbgPrintf("服务程序结束"); g_ss.dwCurrentState = SERVICE_STOPPED; } SetServiceStatus(g_ssh, &g_ss); }
//消息处理, 接收插拔锁的消息 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { DbgPrintf("接收消息(%X, %X, %X, %X)", hwnd, message, wParam, lParam);
//加密锁需要的参数 WORD retcode, handle; DWORD lp1, lp2; WORD p1, p2, p3, p4; BYTE buffer[1024];
if(message == WM_DEVICECHANGE) { //检查加密锁是不是准备好 p1 = 0xc44c; p2 = 0xc8f8; p3 = 0; p4 = 0; retcode = Rockey(RY_FIND, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if(retcode == 0) //找到锁 { if(! DogExistFlag) { DbgPrintf("找到Rockey4Smart加密锁,打开一个记事本程序吧"); ShellExecute(0, 0, "c:\\windows\\notepad.exe", 0, 0, SW_NORMAL); DogExistFlag = true; } } else { DogExistFlag = false; //加密锁不存在 } } return DefWindowProc(hwnd, message, wParam, lParam); }
//创建一个隐藏的窗口接受消息 void CreateReceiveMsgWnd() { DbgPrintf("创建窗口"); WNDCLASS wc = {0}; HWND hwnd; MSG msg; //注册窗口 wc.lpfnWndProc = (WNDPROC) WndProc; // Window procedure address wc.hInstance = GetModuleHandle(0);; // Instance handle wc.lpszClassName = "MyWndClass"; // WNDCLASS name RegisterClass(&wc); //创建窗口 hwnd = CreateWindow( "MyWndClass", // WNDCLASS name "SDK Application", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, // Horizontal position CW_USEDEFAULT, // Vertical position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height HWND_DESKTOP, // Handle of parent window NULL, // Menu handle GetModuleHandle(0), // Application's instance handle NULL // Window-creation data );
while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
//服务的主程序 VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
DbgPrintf("进入服务主程序"); g_ssh = RegisterServiceCtrlHandler("My_Test_Service", ControlHandler); if(g_ssh == 0) return;
//将服务置为启动状态 g_ss.dwServiceType = SERVICE_WIN32; g_ss.dwCurrentState = SERVICE_RUNNING; g_ss.dwControlsAccepted = SERVICE_ACCEPT_STOP; SetServiceStatus(g_ssh, &g_ss);
//创建窗口并处理消息 CreateReceiveMsgWnd(); }
//程序的入口点 void main() { DbgPrintf("入口函数"); //程序中只包含一个服务 SERVICE_TABLE_ENTRY ste[2]; ste[0].lpServiceName = "My_Test_Service"; ste[0].lpServiceProc = ServiceMain; ste[1].lpServiceName = 0; ste[1].lpServiceProc = 0; StartServiceCtrlDispatcher(ste); } |