- Start to put together a services.msc equivalent. - mmc.exe is probably a long way off, thus mmc snap-ins will be too. This will suffice until then. Most of the code should be transferable. Added: trunk/reactos/subsys/system/servman/ Added: trunk/reactos/subsys/system/servman/en.rc Added: trunk/reactos/subsys/system/servman/res/ Added: trunk/reactos/subsys/system/servman/res/applet.ico Added: trunk/reactos/subsys/system/servman/resource.h Added: trunk/reactos/subsys/system/servman/servman.c Added: trunk/reactos/subsys/system/servman/servman.rc Added: trunk/reactos/subsys/system/servman/servman.xml _____
Added: trunk/reactos/subsys/system/servman/en.rc --- trunk/reactos/subsys/system/servman/en.rc 2006-01-05 17:52:39 UTC (rev 20585) +++ trunk/reactos/subsys/system/servman/en.rc 2006-01-05 18:04:46 UTC (rev 20586) @@ -0,0 +1,62 @@
+ +IDR_MAINMENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit",ID_FILE_EXIT + END + POPUP "Action" + BEGIN + MENUITEM "Start",ID_START + MENUITEM "Stop",ID_STOP + MENUITEM "Pause",ID_PAUSE + MENUITEM "Resume",ID_RESUME + MENUITEM "Restart",ID_RESTART + MENUITEM SEPARATOR + MENUITEM "Refresh",ID_REFRESH + MENUITEM SEPARATOR + MENUITEM "Properties",ID_PROP + END + POPUP "View" + BEGIN + MENUITEM "Customize",ID_VIEW_CUSTOMIZE + END + POPUP "Help" + BEGIN + MENUITEM "About",ID_HELP_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FIRSTCOLUMN "Name" + IDS_SECONDCOLUMN "Description" + IDS_THIRDCOLUMN "Status" + IDS_FOURTHCOLUMN "Startup Type" + IDS_FITHCOLUMN "Log On As" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SERVICES_STATUS_RUNNING "Started" + IDS_SERVICES_STATUS_STOPPED "Stopped" + IDS_SERVICES_YES "Yes" + IDS_SERVICES_UNKNOWN "Unknown" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SERVICES_NUM_SERVICES "Num Services: %d" + IDB_START "res/start.bmp" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLTIP_PROP "Properties" + IDS_TOOLTIP_REFRESH "Refresh" + IDS_TOOLTIP_EXPORT "Export list" + IDS_TOOLTIP_START "Start service" + IDS_TOOLTIP_STOP "Stop service" + IDS_TOOLTIP_PAUSE "Pause service" + IDS_TOOLTIP_RESTART "Restart service" +END _____
Added: trunk/reactos/subsys/system/servman/res/applet.ico (Binary files differ) Property changes on: trunk/reactos/subsys/system/servman/res/applet.ico ___________________________________________________________________ Name: svn:mime-type + application/octet-stream _____
Added: trunk/reactos/subsys/system/servman/resource.h --- trunk/reactos/subsys/system/servman/resource.h 2006-01-05 17:52:39 UTC (rev 20585) +++ trunk/reactos/subsys/system/servman/resource.h 2006-01-05 18:04:46 UTC (rev 20586) @@ -0,0 +1,44 @@
+#define IDC_STATIC -1 + +#define IDC_SERVLIST 1000 +#define IDC_TOOLBAR 1001 +#define IDC_STATUSBAR 1002 + +#define ID_PROP 4010 +#define ID_REFRESH 4011 +#define ID_EXPORT 4012 + +#define ID_START 2000 +#define ID_STOP 2001 +#define ID_PAUSE 2002 +#define ID_RESUME 2003 +#define ID_RESTART 2004 + +#define IDR_MAINMENU 102 +#define ID_FILE_EXIT 4001 +#define ID_VIEW_CUSTOMIZE 4021 +#define ID_HELP_ABOUT 4031 + +#define IDS_FIRSTCOLUMN 1 +#define IDS_SECONDCOLUMN 2 +#define IDS_THIRDCOLUMN 3 +#define IDS_FOURTHCOLUMN 4 +#define IDS_FITHCOLUMN 5 + +#define IDS_TOOLTIP_PROP 6000 +#define IDS_TOOLTIP_REFRESH 6001 +#define IDS_TOOLTIP_EXPORT 6002 +#define IDS_TOOLTIP_START 6003 +#define IDS_TOOLTIP_STOP 6004 +#define IDS_TOOLTIP_PAUSE 6005 +#define IDS_TOOLTIP_RESTART 6006 + + +#define IDS_SERVICES_STATUS_RUNNING 5000 +#define IDS_SERVICES_STATUS_STOPPED 5001 +#define IDS_SERVICES_YES 5002 +#define IDS_SERVICES_UNKNOWN 5003 +#define IDS_SERVICES_NUM_SERVICES 5004 + +#define IDB_START 50 +#define IDI_SM_ICON 51 _____
Added: trunk/reactos/subsys/system/servman/servman.c --- trunk/reactos/subsys/system/servman/servman.c 2006-01-05 17:52:39 UTC (rev 20585) +++ trunk/reactos/subsys/system/servman/servman.c 2006-01-05 18:04:46 UTC (rev 20586) @@ -0,0 +1,620 @@
+#include <windows.h> +#include <stdio.h> +#include <tchar.h> +#include <commctrl.h> +#include "resource.h" + +const TCHAR ClassName[] = _T("ServiceManager"); + +HINSTANCE hInstance; +HWND hListView; +HWND hStatus; + + +void +GetServices ( void ) +{ + LV_ITEM item; + WORD wCodePage; + WORD wLangID; + SC_HANDLE ScHandle; + SC_HANDLE hService; + DWORD BytesNeeded = 0; + DWORD ResumeHandle = 0; + DWORD NumServices = 0; + DWORD dwHandle, dwLen; + size_t Index; + UINT BufLen; + TCHAR szStatus[128]; + TCHAR* lpData; + TCHAR* lpBuffer; + TCHAR szStrFileInfo[80]; + TCHAR FileName[MAX_PATH]; + TCHAR szNumServices[32]; + LPVOID pvData; + + LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL; + LPQUERY_SERVICE_CONFIG pServiceConfig = NULL; + ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL; + + ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE); + if (ScHandle != INVALID_HANDLE_VALUE) + { + if (EnumServicesStatusEx(ScHandle, + SC_ENUM_PROCESS_INFO, + SERVICE_WIN32, + SERVICE_STATE_ALL, + (LPBYTE)pServiceStatus, + 0, &BytesNeeded, + &NumServices, + &ResumeHandle, + 0) == 0) + { + /* Call function again if required size was returned */ + if (GetLastError() == ERROR_MORE_DATA) + { + /* reserve memory for service info array */ + pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *) HeapAlloc(GetProcessHeap(), 0, BytesNeeded); + if (pServiceStatus == NULL) + return; + + /* fill array with service info */ + if (EnumServicesStatusEx(ScHandle, + SC_ENUM_PROCESS_INFO, + SERVICE_WIN32, + SERVICE_STATE_ALL, + (LPBYTE)pServiceStatus, + BytesNeeded, + &BytesNeeded, + &NumServices, + &ResumeHandle, + 0) == 0) + { + HeapFree(GetProcessHeap(), 0, pServiceStatus); + return; + } + } + else /* exit on failure */ + { + return; + } + } + + if (NumServices) + { + HICON hiconItem; // icon for list-view items + HIMAGELIST hSmall; // image list for other views + TCHAR buf[40]; + + /* Create the icon image lists */ + hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), ILC_MASK, 1, 1); + + /* Add an icon to each image list */ + hiconItem = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON)); + ImageList_AddIcon(hSmall, hiconItem); + DestroyIcon(hiconItem); + + ListView_SetImageList(hListView, hSmall, LVSIL_SMALL); + + /* set the number of services in the status bar */ + LoadString(hInstance, IDS_SERVICES_NUM_SERVICES, szNumServices, 32); + _stprintf(buf, szNumServices, NumServices); + SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf); + + for (Index = 0; Index < NumServices; Index++) + { + memset(&item, 0, sizeof(LV_ITEM)); + item.mask = LVIF_TEXT; + //item.iImage = 0; + item.pszText = pServiceStatus[Index].lpDisplayName; + item.iItem = ListView_GetItemCount(hListView); + item.lParam = 0; + item.iItem = ListView_InsertItem(hListView, &item); + + BytesNeeded = 0; + hService = OpenService(ScHandle, + pServiceStatus[Index].lpServiceName, + SC_MANAGER_CONNECT); + if (hService != INVALID_HANDLE_VALUE) + { + /* check if service is required by the system*/ + if (!QueryServiceConfig2(hService, + SERVICE_CONFIG_FAILURE_ACTIONS, + (LPBYTE)pServiceFailureActions, + 0, + &BytesNeeded)) + { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS) + HeapAlloc(GetProcessHeap(), 0, BytesNeeded); + if (pServiceFailureActions == NULL) + return; + + if (!QueryServiceConfig2(hService, + SERVICE_CONFIG_FAILURE_ACTIONS, + (LPBYTE)pServiceFailureActions, + BytesNeeded, + &BytesNeeded)) + { + HeapFree(GetProcessHeap(), 0, pServiceFailureActions); + return; + } + } + else /* exit on failure */ + { + return; + } + } + if (pServiceFailureActions->cActions) + { + if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT) + { + LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128); + item.pszText = szStatus; + item.iSubItem = 1; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + } + } + + if (pServiceFailureActions != NULL) + { + HeapFree(GetProcessHeap(), 0, pServiceFailureActions); + pServiceFailureActions = NULL; + } + + /* get vendor of service binary */ + BytesNeeded = 0; + if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded)) + { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + pServiceConfig = (LPQUERY_SERVICE_CONFIG) + HeapAlloc(GetProcessHeap(), 0, BytesNeeded); + if (pServiceConfig == NULL) + return; + + if (!QueryServiceConfig(hService, + pServiceConfig, + BytesNeeded, + &BytesNeeded)) + { + HeapFree(GetProcessHeap(), 0, pServiceConfig); + return; + } + } + else /* exit on failure */ + { + return; + } + } + + memset(&FileName, 0, MAX_PATH); + if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("""))) + { + _tcsncpy(FileName, pServiceConfig->lpBinaryPathName, + _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) ); + } + else + { + _tcscpy(FileName, pServiceConfig->lpBinaryPathName); + } + + HeapFree(GetProcessHeap(), 0, pServiceConfig); + pServiceConfig = NULL; + + dwLen = GetFileVersionInfoSize(FileName, &dwHandle); + if (dwLen) + { + lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen); + if (lpData == NULL) + return; + + if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) { + HeapFree(GetProcessHeap(), 0, lpData); + return; + } + + if (VerQueryValue(lpData, _T("\VarFileInfo\Translation"), &pvData, (PUINT) &BufLen)) + { + wCodePage = LOWORD(*(DWORD*) pvData); + wLangID = HIWORD(*(DWORD*) pvData); + wsprintf(szStrFileInfo, _T("StringFileInfo\%04X%04X\CompanyName"), wCodePage, wLangID); + } + + if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) { + item.pszText = lpBuffer; + item.iSubItem = 2; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + } + HeapFree(GetProcessHeap(), 0, lpData); + } + else + { + LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128); + item.pszText = szStatus; + item.iSubItem = 2; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + } + CloseServiceHandle(hService); + } + + if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING) + { + LoadString(hInstance, IDS_SERVICES_STATUS_RUNNING, szStatus, 128); + item.pszText = szStatus; + item.iSubItem = 2; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + } + else + { + item.pszText = '\0'; + item.iSubItem = 2; + SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); + } + + } + } + + HeapFree(GetProcessHeap(), 0, pServiceStatus); + CloseServiceHandle(ScHandle); + } + + +} + + + +LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_CREATE: + { + //HFONT hfDefault; + + HWND hTool; + TBBUTTON tbb[7]; + TBADDBITMAP tbab; + + int statwidths[] = {110, -1}; + + TCHAR szTemp[256]; + + /* Create List View */ + LVCOLUMN lvc = { 0 }; + //LVITEM lv = { 0 }; + + //GetClientRect(hwnd, &rc); + hListView = CreateWindow(WC_LISTVIEW, + NULL, + WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS, + 0, 0, 0, 0, /* sized via WM_SIZE */ + hwnd, + (HMENU) IDC_SERVLIST, + hInstance, + NULL); + + ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT | + /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP); + + lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; + lvc.fmt = LVCFMT_LEFT; + + /* Add columns to the list-view (first column contains check box). */ + lvc.iSubItem = 0; + lvc.cx = 160; + LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp, 256); + lvc.pszText = szTemp; + ListView_InsertColumn(hListView, 0, &lvc); + + lvc.iSubItem = 1; + lvc.cx = 150; + LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256); + lvc.pszText = szTemp; + ListView_InsertColumn(hListView, 1, &lvc); + + lvc.iSubItem = 2; + lvc.cx = 80; + LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256); + lvc.pszText = szTemp; + ListView_InsertColumn(hListView, 2, &lvc); + + lvc.iSubItem = 3; + lvc.cx = 80; + LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp, 256); + lvc.pszText = szTemp; + ListView_InsertColumn(hListView, 3, &lvc); + + lvc.iSubItem = 4; + lvc.cx = 100; + LoadString(hInstance, IDS_FITHCOLUMN, szTemp, 256); + lvc.pszText = szTemp; + ListView_InsertColumn(hListView, 4, &lvc); + + // Create Toolbar + hTool = CreateWindowEx(0, + TOOLBARCLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS, + 0, 0, 0, 0, + hwnd, + (HMENU)IDC_TOOLBAR, + hInstance, + NULL); + if(hTool == NULL) + MessageBox(hwnd, _T("Could not create tool bar."), _T("Error"), MB_OK | MB_ICONERROR); + + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + tbab.hInst = HINST_COMMCTRL; + tbab.nID = IDB_STD_SMALL_COLOR; + SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab); + + ZeroMemory(tbb, sizeof(tbb)); + tbb[0].iBitmap = STD_PROPERTIES; + tbb[0].fsState = TBSTATE_ENABLED; + tbb[0].fsStyle = TBSTYLE_BUTTON; + tbb[0].idCommand = ID_PROP; + tbb[1].iBitmap = STD_FILENEW; + tbb[1].fsState = TBSTATE_ENABLED; + tbb[1].fsStyle = TBSTYLE_BUTTON; + tbb[1].idCommand = ID_REFRESH; + tbb[2].iBitmap = STD_FILENEW; + tbb[2].fsState = TBSTATE_ENABLED; + tbb[2].fsStyle = TBSTYLE_BUTTON; + tbb[2].idCommand = ID_EXPORT; + /* seperator */ + tbb[3].iBitmap = STD_FILENEW; + tbb[3].fsState = TBSTATE_ENABLED; + tbb[3].fsStyle = TBSTYLE_BUTTON; + tbb[3].idCommand = ID_START; + tbb[4].iBitmap = STD_FILENEW; + tbb[4].fsState = TBSTATE_ENABLED; + tbb[4].fsStyle = TBSTYLE_BUTTON; + tbb[4].idCommand = ID_STOP; + tbb[5].iBitmap = STD_FILENEW; + tbb[5].fsState = TBSTATE_ENABLED; + tbb[5].fsStyle = TBSTYLE_BUTTON; + tbb[5].idCommand = ID_PAUSE; + tbb[6].iBitmap = STD_FILENEW; + tbb[6].fsState = TBSTATE_ENABLED; + tbb[6].fsStyle = TBSTYLE_BUTTON; + tbb[6].idCommand = ID_RESTART; + SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb); + + /* Create Status bar */ + hStatus = CreateWindowEx(0, + STATUSCLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, + 0, 0, 0, 0, + hwnd, + (HMENU)IDC_STATUSBAR, + hInstance, + NULL); + if(hStatus == NULL) + MessageBox(hwnd, _T("Could not create status bar."), _T("Error"), MB_OK | MB_ICONERROR); + + SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths); + + /* populate the list view with all services */ + GetServices(); + } + break; + case WM_SIZE: + { + HWND hTool; + RECT rcTool; + int iToolHeight; + + HWND hStatus; + RECT rcStatus; + int iStatusHeight; + + HWND hListView; + int lvHeight; + RECT rcClient; + + /* Size toolbar and get height */ + hTool = GetDlgItem(hwnd, IDC_TOOLBAR); + SendMessage(hTool, TB_AUTOSIZE, 0, 0); + + GetWindowRect(hTool, &rcTool); + iToolHeight = rcTool.bottom - rcTool.top; + + /* Size status bar and get height */ + hStatus = GetDlgItem(hwnd, IDC_STATUSBAR); + SendMessage(hStatus, WM_SIZE, 0, 0); + + GetWindowRect(hStatus, &rcStatus); + iStatusHeight = rcStatus.bottom - rcStatus.top; + + /* Calculate remaining height and size list view */ + GetClientRect(hwnd, &rcClient); + + lvHeight = rcClient.bottom - iToolHeight - iStatusHeight; + + hListView = GetDlgItem(hwnd, IDC_SERVLIST); + SetWindowPos(hListView, NULL, 0, iToolHeight, rcClient.right, lvHeight, SWP_NOZORDER); + } + break; + + case WM_NOTIFY: + switch (((LPNMHDR) lParam)->code) + { + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + UINT idButton; + + lpttt = (LPTOOLTIPTEXT) lParam; + lpttt->hinst = hInstance; + + // Specify the resource identifier of the descriptive + // text for the given button. + idButton = lpttt->hdr.idFrom; + switch (idButton) + { + case ID_PROP: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PROP); + break; + + case ID_REFRESH: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH); + break; + + case ID_EXPORT: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXPORT); + break; + + case ID_START: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_START); + break; + + case ID_STOP: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_STOP); + break; + + case ID_PAUSE: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PAUSE); + break; + + case ID_RESTART: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART); + break; + + } + } + break; + + // Process other notifications here. + + default: + break; + } + break; + + case WM_CLOSE: + DestroyWindow(hwnd); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case ID_FILE_EXIT: + PostMessage(hwnd, WM_CLOSE, 0, 0); + break; + + case ID_START: + break; + + case ID_STOP: + break; + + case ID_PAUSE: + break; + + case ID_RESUME: + break; + + case ID_RESTART: + break; + + case ID_REFRESH: + break; + + case ID_PROP: + break; + + case ID_VIEW_CUSTOMIZE: + break; + + case ID_HELP_ABOUT: + break; + + case ID_EXPORT: + break; + + } + break; + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + return 0; +} + + + +int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow) +{ + WNDCLASSEX wc; + HWND hwnd; + MSG Msg; + BOOL bRet; + + hInstance = hThisInstance; + + InitCommonControls(); + + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = 0; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SM_ICON)); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); + wc.lpszClassName = ClassName; + wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), + MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0); + + if(!RegisterClassEx(&wc)) + { + MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"), + MB_ICONEXCLAMATION | MB_OK); + return 0; + } + + hwnd = CreateWindowEx( + 0, + ClassName, + _T("ReactOS Service Manager"), + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 700, 500, + NULL, NULL, hInstance, NULL); + + if(hwnd == NULL) + { + MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"), + MB_ICONEXCLAMATION | MB_OK); + return 0; + } + + ShowWindow(hwnd, nCmdShow); + UpdateWindow(hwnd); + + while( (bRet = GetMessage( &Msg, NULL, 0, 0 )) != 0) + { + if (bRet == -1) + { + /* handle the error and possibly exit */ + } + else + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + return Msg.wParam; +} + + _____
Added: trunk/reactos/subsys/system/servman/servman.rc --- trunk/reactos/subsys/system/servman/servman.rc 2006-01-05 17:52:39 UTC (rev 20585) +++ trunk/reactos/subsys/system/servman/servman.rc 2006-01-05 18:04:46 UTC (rev 20586) @@ -0,0 +1,16 @@
+#include <windows.h> +#include <commctrl.h> +#include "resource.h" + + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Service Manager\0" +#define REACTOS_STR_INTERNAL_NAME "services\0" +#define REACTOS_STR_ORIGINAL_FILENAME "services.exe\0" +#include <reactos/version.rc> + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDI_SM_ICON ICON "res/applet.ico" + +#include "En.rc" + _____
Added: trunk/reactos/subsys/system/servman/servman.xml --- trunk/reactos/subsys/system/servman/servman.xml 2006-01-05 17:52:39 UTC (rev 20585) +++ trunk/reactos/subsys/system/servman/servman.xml 2006-01-05 18:04:46 UTC (rev 20586) @@ -0,0 +1,19 @@
+<module name="servman" type="win32gui" installbase="system32" installname="servman.exe"> + <include base="msconfig">.</include> + <define name="UNICODE" /> + <define name="_UNICODE" /> + <define name="__REACTOS__" /> + <define name="__USE_W32API" /> + <define name="_WIN32_IE">0x600</define> + <define name="_WIN32_WINNT">0x501</define> + <library>kernel32</library> + <library>user32</library> + <library>advapi32</library> + <library>version</library> + <library>comctl32</library> + <library>shell32</library> + <compilationunit name="unit.c"> + <file>servman.c</file> + </compilationunit> + <file>servman.rc</file> +</module>