bool removeService() { AFILE_TRACER_DEBUG_SCOPE("removeService", NULL); SC_HANDLE schManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (NULL == schManager) { AFILE_TRACER_DEBUG_MESSAGE("Unable to open service control manager", NULL); ATHROW_LAST_OS_ERROR(NULL); } AFILE_TRACER_DEBUG_MESSAGE((AString("Trying to open service: ")+AOS_SERVICE_NAME).c_str(), NULL); SC_HANDLE schService = ::OpenService(schManager, AOS_SERVICE_NAME, SERVICE_ALL_ACCESS); if (NULL == schService) { //a_Open service failed AFILE_TRACER_DEBUG_MESSAGE("Unable to open service", NULL); u4 lastOSError = ::GetLastError(); closeService(schManager, schService); ATHROW_LAST_OS_ERROR_KNOWN_EX(NULL, lastOSError, AString("Unable to open service: ")+AOS_SERVICE_NAME); } AFILE_TRACER_DEBUG_MESSAGE((ASWNL("Service opened: ")+AOS_SERVICE_NAME).c_str(), NULL); if(schService && !DeleteService(schService)) { //a_Unable to delete DWORD errorNumber = GetLastError(); closeService(schManager, schService); ATHROW_LAST_OS_ERROR_KNOWN(NULL, errorNumber); } AFILE_TRACER_DEBUG_MESSAGE("Service removed.", NULL); closeService(schManager, schService); return 1; }
bool installService() { AFILE_TRACER_DEBUG_SCOPE("installService", NULL); AFILE_TRACER_DEBUG_MESSAGE("Service connected to controller.", NULL); SC_HANDLE schManager = ::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS | SC_MANAGER_CREATE_SERVICE); if(!schManager) { AFILE_TRACER_DEBUG_MESSAGE("Unable to open service manager", NULL); ATHROW_LAST_OS_ERROR(NULL); } //a_Now that the service manager is open, let's open the service char sPath[1024]; //a_Who knows, long filenames may be really long GetModuleFileName(GetModuleHandle(NULL), sPath, 1023); // "Normalize" the name and add the arguments. AString imagePath; if ( sPath[0] != '\"' ) { imagePath = '\"'; imagePath += sPath; imagePath += '\"'; } else { imagePath = sPath; } SC_HANDLE schService = ::CreateService( schManager, // SC_HANDLE hSCManager, AOS_SERVICE_NAME, // LPCSTR lpServiceName, AOS_SERVICE_NAME, // LPCSTR lpDisplayName, SERVICE_ALL_ACCESS, // DWORD dwDesiredAccess, SERVICE_WIN32_OWN_PROCESS, // DWORD dwServiceType, SERVICE_AUTO_START, // DWORD dwStartType, SERVICE_ERROR_NORMAL, // DWORD dwErrorControl, TEXT(imagePath.c_str()), // LPCSTR lpBinaryPathName, NULL, // LPCSTR lpLoadOrderGroup, NULL, // LPDWORD lpdwTagId, NULL, // LPCSTR lpDependencies, NULL, // LPCSTR lpServiceStartName, NULL // LPCSTR lpPassword ); if (NULL == schService) { AFILE_TRACER_DEBUG_MESSAGE("Unable to create service", NULL); u4 lastOSError = ::GetLastError(); closeService(schManager, schService); ATHROW_LAST_OS_ERROR_KNOWN(NULL, lastOSError); } else { //a_Set service optional info after create SERVICE_DESCRIPTION sd; sd.lpDescription = AOS_SERVICE_DESC; if (!::ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sd)) ATHROW_LAST_OS_ERROR(NULL); } closeService(schManager, schService); AFILE_TRACER_DEBUG_MESSAGE("Service installed.", NULL); return true; }
// // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDB_BUTTON: break; case IDB_BUTTON_CONNECT: TCHAR ip_port[MAX_NUM_BUF]; memset(ip_port,0,MAX_NUM_BUF); GetWindowText(ipEditHwnd, ip_port, MAX_NUM_BUF); strcpy_s(ip, sizeof(ip), ip_port); memset(ip_port,0,MAX_NUM_BUF); GetWindowText(portEditHwnd, ip_port, MAX_NUM_BUF); port = atoi(ip_port); if(connectStatus != TRUE)//还未连接服务器,现在连接 { // Windows Sockets 动态库的初始化 InitDll(hWnd); //创建SOCKET InitSocket(clientSocket, hWnd); // 连接服务器 connectServer(hWnd); } if(connectStatus != TRUE) { mySetWindowText("连接服务器失败"); break; } break; case IDB_BUTTON_SEND: { if (connectStatus == FALSE) { mySetWindowText("还没连接,别乱发数据"); break; } // 设置和获取文本框里的内容 TCHAR editTextBuffer[MAX_NUM_BUF]; memset(editTextBuffer,0,MAX_NUM_BUF); GetWindowText(sendEditHwnd, editTextBuffer, MAX_NUM_BUF); int ret = sendLine(clientSocket, editTextBuffer, hWnd); if (SOCKET_ERROR == ret) { mySetWindowText("发送失败"); break; } break; } case IDB_BUTTON_CLOSE: { // 如果已经关闭 不作反应 if (connectStatus == FALSE) { mySetWindowText("client has stopped"); break; } sendLine(clientSocket, "close", hWnd); int ret = closeService(clientSocket); if(SOCKET_ERROR == ret) { mySetWindowText("client closesocket fail"); break; }else if (TRUE == ret) { mySetWindowText("客户端关闭socket成功"); break; } mySetWindowText("服务器关闭不成功,但是怎么失败的我也不知道"); break; } default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_LBUTTONDOWN: { // 设置和获取文本框里的内容 /* TCHAR editTextBuffer[MAX_NUM_BUF]; GetWindowText(receiveEditHwnd, editTextBuffer, MAX_NUM_BUF); HDC hdc = GetDC(hWnd); TCHAR newTextStr[MAX_NUM_BUF]; wsprintf(newTextStr,TEXT("%s - %s"),editTextBuffer,"receiveEditHwnd"); SetWindowText(receiveEditHwnd, newTextStr); */ break; } case WM_CREATE: { receiveEditHwnd = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_MULTILINE , 30, 80, 300, 200, hWnd, (HMENU)HMENU_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); sendEditHwnd = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_MULTILINE , 30, 370, 300, 50, hWnd, (HMENU)HMENU_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); ipEditHwnd = CreateWindow("edit", TEXT("192.168.1.101"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_MULTILINE , 50, 430, 130, 30, hWnd, (HMENU)HMENU_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); portEditHwnd = CreateWindow("edit", TEXT("5419"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_MULTILINE , 240, 430, 60, 30, hWnd, (HMENU)HMENU_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); buttonConnect = CreateWindow("button", TEXT("连接服务"), WS_CHILD | WS_VISIBLE | WS_BORDER , 30, 470, 90, 30, hWnd, (HMENU)IDB_BUTTON_CONNECT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); buttonSend = CreateWindow("button", TEXT("发送数据"), WS_CHILD | WS_VISIBLE | WS_BORDER , 130, 470, 90, 30, hWnd, (HMENU)IDB_BUTTON_SEND, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); buttonClose = CreateWindow("button", TEXT("断开服务"), WS_CHILD | WS_VISIBLE | WS_BORDER , 230, 470, 90, 30, hWnd, (HMENU)IDB_BUTTON_CLOSE, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); buttonHwnd = CreateWindow("button", TEXT("B"), WS_CHILD | WS_VISIBLE | WS_BORDER , 240, 10, 30, 20, hWnd, (HMENU)IDB_BUTTON, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); break; } case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }