--- /dev/null
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <tchar.h>\r
+#include <commctrl.h>\r
+#include "resource.h"\r
+\r
+const TCHAR ClassName[] = _T("ServiceManager");\r
+\r
+HINSTANCE hInstance;\r
+HWND hListView;\r
+HWND hStatus;\r
+\r
+\r
+void\r
+GetServices ( void )\r
+{\r
+ LV_ITEM item;\r
+ WORD wCodePage;\r
+ WORD wLangID;\r
+ SC_HANDLE ScHandle;\r
+ SC_HANDLE hService;\r
+ DWORD BytesNeeded = 0;\r
+ DWORD ResumeHandle = 0;\r
+ DWORD NumServices = 0;\r
+ DWORD dwHandle, dwLen;\r
+ size_t Index;\r
+ UINT BufLen;\r
+ TCHAR szStatus[128];\r
+ TCHAR* lpData;\r
+ TCHAR* lpBuffer;\r
+ TCHAR szStrFileInfo[80];\r
+ TCHAR FileName[MAX_PATH];\r
+ TCHAR szNumServices[32];\r
+ LPVOID pvData;\r
+\r
+ LPSERVICE_FAILURE_ACTIONS pServiceFailureActions = NULL;\r
+ LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;\r
+ ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;\r
+\r
+ ScHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);\r
+ if (ScHandle != INVALID_HANDLE_VALUE)\r
+ {\r
+ if (EnumServicesStatusEx(ScHandle,\r
+ SC_ENUM_PROCESS_INFO,\r
+ SERVICE_WIN32,\r
+ SERVICE_STATE_ALL,\r
+ (LPBYTE)pServiceStatus,\r
+ 0, &BytesNeeded,\r
+ &NumServices,\r
+ &ResumeHandle,\r
+ 0) == 0)\r
+ {\r
+ /* Call function again if required size was returned */\r
+ if (GetLastError() == ERROR_MORE_DATA)\r
+ {\r
+ /* reserve memory for service info array */\r
+ pServiceStatus = (ENUM_SERVICE_STATUS_PROCESS *) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+ if (pServiceStatus == NULL)\r
+ return;\r
+\r
+ /* fill array with service info */\r
+ if (EnumServicesStatusEx(ScHandle,\r
+ SC_ENUM_PROCESS_INFO,\r
+ SERVICE_WIN32,\r
+ SERVICE_STATE_ALL,\r
+ (LPBYTE)pServiceStatus,\r
+ BytesNeeded,\r
+ &BytesNeeded,\r
+ &NumServices,\r
+ &ResumeHandle,\r
+ 0) == 0)\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
+ return;\r
+ }\r
+ }\r
+ else /* exit on failure */\r
+ {\r
+ return;\r
+ }\r
+ }\r
+\r
+ if (NumServices)\r
+ {\r
+ HICON hiconItem; // icon for list-view items\r
+ HIMAGELIST hSmall; // image list for other views\r
+ TCHAR buf[40];\r
+\r
+ /* Create the icon image lists */\r
+ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),\r
+ GetSystemMetrics(SM_CYSMICON), ILC_MASK, 1, 1);\r
+\r
+ /* Add an icon to each image list */\r
+ hiconItem = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));\r
+ ImageList_AddIcon(hSmall, hiconItem);\r
+ DestroyIcon(hiconItem);\r
+\r
+ ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);\r
+\r
+ /* set the number of services in the status bar */\r
+ LoadString(hInstance, IDS_SERVICES_NUM_SERVICES, szNumServices, 32);\r
+ _stprintf(buf, szNumServices, NumServices);\r
+ SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);\r
+\r
+ for (Index = 0; Index < NumServices; Index++)\r
+ {\r
+ memset(&item, 0, sizeof(LV_ITEM));\r
+ item.mask = LVIF_TEXT;\r
+ //item.iImage = 0;\r
+ item.pszText = pServiceStatus[Index].lpDisplayName;\r
+ item.iItem = ListView_GetItemCount(hListView);\r
+ item.lParam = 0;\r
+ item.iItem = ListView_InsertItem(hListView, &item);\r
+\r
+ BytesNeeded = 0;\r
+ hService = OpenService(ScHandle,\r
+ pServiceStatus[Index].lpServiceName,\r
+ SC_MANAGER_CONNECT);\r
+ if (hService != INVALID_HANDLE_VALUE)\r
+ {\r
+ /* check if service is required by the system*/\r
+ if (!QueryServiceConfig2(hService,\r
+ SERVICE_CONFIG_FAILURE_ACTIONS,\r
+ (LPBYTE)pServiceFailureActions,\r
+ 0,\r
+ &BytesNeeded))\r
+ {\r
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
+ {\r
+ pServiceFailureActions = (LPSERVICE_FAILURE_ACTIONS)\r
+ HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+ if (pServiceFailureActions == NULL)\r
+ return;\r
+\r
+ if (!QueryServiceConfig2(hService,\r
+ SERVICE_CONFIG_FAILURE_ACTIONS,\r
+ (LPBYTE)pServiceFailureActions,\r
+ BytesNeeded,\r
+ &BytesNeeded))\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
+ return;\r
+ }\r
+ }\r
+ else /* exit on failure */\r
+ {\r
+ return;\r
+ }\r
+ }\r
+ if (pServiceFailureActions->cActions)\r
+ {\r
+ if (pServiceFailureActions->lpsaActions[0].Type == SC_ACTION_REBOOT)\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_YES, szStatus, 128);\r
+ item.pszText = szStatus;\r
+ item.iSubItem = 1;\r
+ SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+ }\r
+ }\r
+\r
+ if (pServiceFailureActions != NULL)\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, pServiceFailureActions);\r
+ pServiceFailureActions = NULL;\r
+ }\r
+\r
+ /* get vendor of service binary */\r
+ BytesNeeded = 0;\r
+ if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))\r
+ {\r
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r
+ {\r
+ pServiceConfig = (LPQUERY_SERVICE_CONFIG)\r
+ HeapAlloc(GetProcessHeap(), 0, BytesNeeded);\r
+ if (pServiceConfig == NULL)\r
+ return;\r
+\r
+ if (!QueryServiceConfig(hService,\r
+ pServiceConfig,\r
+ BytesNeeded,\r
+ &BytesNeeded))\r
+ {\r
+ HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
+ return;\r
+ }\r
+ }\r
+ else /* exit on failure */\r
+ {\r
+ return;\r
+ }\r
+ }\r
+\r
+ memset(&FileName, 0, MAX_PATH);\r
+ if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))\r
+ {\r
+ _tcsncpy(FileName, pServiceConfig->lpBinaryPathName,\r
+ _tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );\r
+ }\r
+ else\r
+ {\r
+ _tcscpy(FileName, pServiceConfig->lpBinaryPathName);\r
+ }\r
+\r
+ HeapFree(GetProcessHeap(), 0, pServiceConfig);\r
+ pServiceConfig = NULL;\r
+\r
+ dwLen = GetFileVersionInfoSize(FileName, &dwHandle);\r
+ if (dwLen)\r
+ {\r
+ lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);\r
+ if (lpData == NULL)\r
+ return;\r
+\r
+ if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData)) {\r
+ HeapFree(GetProcessHeap(), 0, lpData);\r
+ return;\r
+ }\r
+\r
+ if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &pvData, (PUINT) &BufLen))\r
+ {\r
+ wCodePage = LOWORD(*(DWORD*) pvData);\r
+ wLangID = HIWORD(*(DWORD*) pvData);\r
+ wsprintf(szStrFileInfo, _T("StringFileInfo\\%04X%04X\\CompanyName"), wCodePage, wLangID);\r
+ }\r
+\r
+ if (VerQueryValue (lpData, szStrFileInfo, (LPVOID) &lpBuffer, (PUINT) &BufLen)) {\r
+ item.pszText = lpBuffer;\r
+ item.iSubItem = 2;\r
+ SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+ }\r
+ HeapFree(GetProcessHeap(), 0, lpData);\r
+ }\r
+ else\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_UNKNOWN, szStatus, 128);\r
+ item.pszText = szStatus;\r
+ item.iSubItem = 2;\r
+ SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+ }\r
+ CloseServiceHandle(hService);\r
+ }\r
+\r
+ if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)\r
+ {\r
+ LoadString(hInstance, IDS_SERVICES_STATUS_RUNNING, szStatus, 128);\r
+ item.pszText = szStatus;\r
+ item.iSubItem = 2;\r
+ SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+ }\r
+ else\r
+ {\r
+ item.pszText = '\0';\r
+ item.iSubItem = 2;\r
+ SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ HeapFree(GetProcessHeap(), 0, pServiceStatus);\r
+ CloseServiceHandle(ScHandle);\r
+ }\r
+\r
+\r
+}\r
+\r
+\r
+\r
+LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
+{\r
+ switch(msg)\r
+ {\r
+ case WM_CREATE:\r
+ {\r
+ //HFONT hfDefault;\r
+\r
+ HWND hTool;\r
+ TBBUTTON tbb[7];\r
+ TBADDBITMAP tbab;\r
+\r
+ int statwidths[] = {110, -1};\r
+\r
+ TCHAR szTemp[256];\r
+\r
+ /* Create List View */\r
+ LVCOLUMN lvc = { 0 };\r
+ //LVITEM lv = { 0 };\r
+\r
+ //GetClientRect(hwnd, &rc);\r
+ hListView = CreateWindow(WC_LISTVIEW,\r
+ NULL,\r
+ WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS,\r
+ 0, 0, 0, 0, /* sized via WM_SIZE */\r
+ hwnd,\r
+ (HMENU) IDC_SERVLIST,\r
+ hInstance,\r
+ NULL);\r
+\r
+ ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT |\r
+ /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP);\r
+\r
+ lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;\r
+ lvc.fmt = LVCFMT_LEFT;\r
+\r
+ /* Add columns to the list-view (first column contains check box). */\r
+ lvc.iSubItem = 0;\r
+ lvc.cx = 160;\r
+ LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp, 256);\r
+ lvc.pszText = szTemp;\r
+ ListView_InsertColumn(hListView, 0, &lvc);\r
+\r
+ lvc.iSubItem = 1;\r
+ lvc.cx = 150;\r
+ LoadString(hInstance, IDS_SECONDCOLUMN, szTemp, 256);\r
+ lvc.pszText = szTemp;\r
+ ListView_InsertColumn(hListView, 1, &lvc);\r
+\r
+ lvc.iSubItem = 2;\r
+ lvc.cx = 80;\r
+ LoadString(hInstance, IDS_THIRDCOLUMN, szTemp, 256);\r
+ lvc.pszText = szTemp;\r
+ ListView_InsertColumn(hListView, 2, &lvc);\r
+\r
+ lvc.iSubItem = 3;\r
+ lvc.cx = 80;\r
+ LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp, 256);\r
+ lvc.pszText = szTemp;\r
+ ListView_InsertColumn(hListView, 3, &lvc);\r
+\r
+ lvc.iSubItem = 4;\r
+ lvc.cx = 100;\r
+ LoadString(hInstance, IDS_FITHCOLUMN, szTemp, 256);\r
+ lvc.pszText = szTemp;\r
+ ListView_InsertColumn(hListView, 4, &lvc);\r
+\r
+ // Create Toolbar\r
+ hTool = CreateWindowEx(0,\r
+ TOOLBARCLASSNAME,\r
+ NULL,\r
+ WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,\r
+ 0, 0, 0, 0,\r
+ hwnd,\r
+ (HMENU)IDC_TOOLBAR,\r
+ hInstance,\r
+ NULL);\r
+ if(hTool == NULL)\r
+ MessageBox(hwnd, _T("Could not create tool bar."), _T("Error"), MB_OK | MB_ICONERROR);\r
+\r
+ // Send the TB_BUTTONSTRUCTSIZE message, which is required for\r
+ // backward compatibility.\r
+ SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);\r
+\r
+ tbab.hInst = HINST_COMMCTRL;\r
+ tbab.nID = IDB_STD_SMALL_COLOR;\r
+ SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);\r
+\r
+ ZeroMemory(tbb, sizeof(tbb));\r
+ tbb[0].iBitmap = STD_PROPERTIES;\r
+ tbb[0].fsState = TBSTATE_ENABLED;\r
+ tbb[0].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[0].idCommand = ID_PROP;\r
+ tbb[1].iBitmap = STD_FILENEW;\r
+ tbb[1].fsState = TBSTATE_ENABLED;\r
+ tbb[1].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[1].idCommand = ID_REFRESH;\r
+ tbb[2].iBitmap = STD_FILENEW;\r
+ tbb[2].fsState = TBSTATE_ENABLED;\r
+ tbb[2].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[2].idCommand = ID_EXPORT;\r
+ /* seperator */\r
+ tbb[3].iBitmap = STD_FILENEW;\r
+ tbb[3].fsState = TBSTATE_ENABLED;\r
+ tbb[3].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[3].idCommand = ID_START;\r
+ tbb[4].iBitmap = STD_FILENEW;\r
+ tbb[4].fsState = TBSTATE_ENABLED;\r
+ tbb[4].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[4].idCommand = ID_STOP;\r
+ tbb[5].iBitmap = STD_FILENEW;\r
+ tbb[5].fsState = TBSTATE_ENABLED;\r
+ tbb[5].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[5].idCommand = ID_PAUSE;\r
+ tbb[6].iBitmap = STD_FILENEW;\r
+ tbb[6].fsState = TBSTATE_ENABLED;\r
+ tbb[6].fsStyle = TBSTYLE_BUTTON;\r
+ tbb[6].idCommand = ID_RESTART;\r
+ SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);\r
+\r
+ /* Create Status bar */\r
+ hStatus = CreateWindowEx(0,\r
+ STATUSCLASSNAME,\r
+ NULL,\r
+ WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,\r
+ 0, 0, 0, 0,\r
+ hwnd,\r
+ (HMENU)IDC_STATUSBAR,\r
+ hInstance,\r
+ NULL);\r
+ if(hStatus == NULL)\r
+ MessageBox(hwnd, _T("Could not create status bar."), _T("Error"), MB_OK | MB_ICONERROR);\r
+\r
+ SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);\r
+\r
+ /* populate the list view with all services */\r
+ GetServices();\r
+ }\r
+ break;\r
+ case WM_SIZE:\r
+ {\r
+ HWND hTool;\r
+ RECT rcTool;\r
+ int iToolHeight;\r
+\r
+ HWND hStatus;\r
+ RECT rcStatus;\r
+ int iStatusHeight;\r
+\r
+ HWND hListView;\r
+ int lvHeight;\r
+ RECT rcClient;\r
+\r
+ /* Size toolbar and get height */\r
+ hTool = GetDlgItem(hwnd, IDC_TOOLBAR);\r
+ SendMessage(hTool, TB_AUTOSIZE, 0, 0);\r
+\r
+ GetWindowRect(hTool, &rcTool);\r
+ iToolHeight = rcTool.bottom - rcTool.top;\r
+\r
+ /* Size status bar and get height */\r
+ hStatus = GetDlgItem(hwnd, IDC_STATUSBAR);\r
+ SendMessage(hStatus, WM_SIZE, 0, 0);\r
+\r
+ GetWindowRect(hStatus, &rcStatus);\r
+ iStatusHeight = rcStatus.bottom - rcStatus.top;\r
+\r
+ /* Calculate remaining height and size list view */\r
+ GetClientRect(hwnd, &rcClient);\r
+\r
+ lvHeight = rcClient.bottom - iToolHeight - iStatusHeight;\r
+\r
+ hListView = GetDlgItem(hwnd, IDC_SERVLIST);\r
+ SetWindowPos(hListView, NULL, 0, iToolHeight, rcClient.right, lvHeight, SWP_NOZORDER);\r
+ }\r
+ break;\r
+\r
+ case WM_NOTIFY:\r
+ switch (((LPNMHDR) lParam)->code)\r
+ {\r
+ case TTN_GETDISPINFO:\r
+ {\r
+ LPTOOLTIPTEXT lpttt;\r
+ UINT idButton;\r
+\r
+ lpttt = (LPTOOLTIPTEXT) lParam;\r
+ lpttt->hinst = hInstance;\r
+\r
+ // Specify the resource identifier of the descriptive\r
+ // text for the given button.\r
+ idButton = lpttt->hdr.idFrom;\r
+ switch (idButton)\r
+ {\r
+ case ID_PROP:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PROP);\r
+ break;\r
+\r
+ case ID_REFRESH:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH);\r
+ break;\r
+\r
+ case ID_EXPORT:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXPORT);\r
+ break;\r
+\r
+ case ID_START:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_START);\r
+ break;\r
+\r
+ case ID_STOP:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_STOP);\r
+ break;\r
+\r
+ case ID_PAUSE:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PAUSE);\r
+ break;\r
+\r
+ case ID_RESTART:\r
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART);\r
+ break;\r
+\r
+ }\r
+ }\r
+ break;\r
+\r
+ // Process other notifications here.\r
+\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case WM_CLOSE:\r
+ DestroyWindow(hwnd);\r
+ break;\r
+ case WM_DESTROY:\r
+ PostQuitMessage(0);\r
+ break;\r
+ case WM_COMMAND:\r
+ switch(LOWORD(wParam))\r
+ {\r
+ case ID_FILE_EXIT:\r
+ PostMessage(hwnd, WM_CLOSE, 0, 0);\r
+ break;\r
+\r
+ case ID_START:\r
+ break;\r
+\r
+ case ID_STOP:\r
+ break;\r
+\r
+ case ID_PAUSE:\r
+ break;\r
+\r
+ case ID_RESUME:\r
+ break;\r
+\r
+ case ID_RESTART:\r
+ break;\r
+\r
+ case ID_REFRESH:\r
+ break;\r
+\r
+ case ID_PROP:\r
+ break;\r
+\r
+ case ID_VIEW_CUSTOMIZE:\r
+ break;\r
+\r
+ case ID_HELP_ABOUT:\r
+ break;\r
+\r
+ case ID_EXPORT:\r
+ break;\r
+\r
+ }\r
+ break;\r
+ default:\r
+ return DefWindowProc(hwnd, msg, wParam, lParam);\r
+ }\r
+ return 0;\r
+}\r
+\r
+\r
+\r
+int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,\r
+ LPSTR lpCmdLine, int nCmdShow)\r
+{\r
+ WNDCLASSEX wc;\r
+ HWND hwnd;\r
+ MSG Msg;\r
+ BOOL bRet;\r
+\r
+ hInstance = hThisInstance;\r
+\r
+ InitCommonControls();\r
+\r
+ wc.cbSize = sizeof(WNDCLASSEX);\r
+ wc.style = 0;\r
+ wc.lpfnWndProc = WndProc;\r
+ wc.cbClsExtra = 0;\r
+ wc.cbWndExtra = 0;\r
+ wc.hInstance = hInstance;\r
+ wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SM_ICON));\r
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
+ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);\r
+ wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);\r
+ wc.lpszClassName = ClassName;\r
+ wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),\r
+ MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0);\r
+\r
+ if(!RegisterClassEx(&wc))\r
+ {\r
+ MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"),\r
+ MB_ICONEXCLAMATION | MB_OK);\r
+ return 0;\r
+ }\r
+\r
+ hwnd = CreateWindowEx(\r
+ 0,\r
+ ClassName,\r
+ _T("ReactOS Service Manager"),\r
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\r
+ CW_USEDEFAULT, CW_USEDEFAULT, 700, 500,\r
+ NULL, NULL, hInstance, NULL);\r
+\r
+ if(hwnd == NULL)\r
+ {\r
+ MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"),\r
+ MB_ICONEXCLAMATION | MB_OK);\r
+ return 0;\r
+ }\r
+\r
+ ShowWindow(hwnd, nCmdShow);\r
+ UpdateWindow(hwnd);\r
+\r
+ while( (bRet = GetMessage( &Msg, NULL, 0, 0 )) != 0)\r
+ {\r
+ if (bRet == -1)\r
+ {\r
+ /* handle the error and possibly exit */\r
+ }\r
+ else\r
+ {\r
+ TranslateMessage(&Msg);\r
+ DispatchMessage(&Msg);\r
+ }\r
+ }\r
+ return Msg.wParam;\r
+}\r
+\r
+\r