Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860

Ошибка в функции ожидания и запуска

18.05.2019, 19:28. Показов 795. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ошибка на скрине

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
// Sample1.cpp
// Copyright (c), А.В. Глухоедов (andrei.glukhoedov@gmail.com)
#include <Windows.h>
#include <WindowsX.h>
#include <tchar.h>
#include <strsafe.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
#include "Resource.h"
#define IDC_LIST_PROCESSES             2001
#define IDC_LIST_MODULES                2002
HANDLE hSampleJob = NULL; // дескриптор задания
// оконная процедура главного окна
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// обработчик сообщения WM_CREATE
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
// обработчик сообщения WM_DESTROY
void OnDestroy(HWND hwnd);
// обработчик сообщения WM_SIZE
void OnSize(HWND hwnd, UINT state, int cx, int cy);
// обработчик сообщения WM_COMMAND
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
// процедура диалогового окна
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
// обработчик сообщения WM_INITDIALOG
BOOL Dialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
// обработчик сообщения WM_CLOSE
void Dialog_OnClose(HWND hwnd);
// обработчик сообщения WM_COMMAND
void Dialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
// функция, перечисляющая процессы системы
void LoadProcessesToListBox(HWND hwndCtl);
// функция, перечисляющая загруженный модули
void LoadModulesToListBox(HWND hwndCtl, DWORD dwProcessId);
// функция, перечисляющая процессы в задании
void LoadProcessesInJobToListBox(HWND hwndCtl, HANDLE hJob = NULL);
// функция, ожидающая завершения процесса
BOOL WaitProcessById(DWORD dwProcessId, DWORD dwMilliseconds, LPDWORD lpExitCode);
// функция, запускающая группу процессов в одном задании
BOOL StartGroupProcessesAsJob(HANDLE hJob, LPCTSTR lpszCmdLine[], DWORD nCount, BOOL bInheritHandles, DWORD dwCreationFlags);
// функция, которая возвращает список идентификаторов включенных в задание процессов
BOOL EnumProcessesInJob(HANDLE hJob, ULONG_PTR *lpidProcess, DWORD cb, LPDWORD lpcbNeeded);
// ------------------------------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpszCmdLine, int nCmdShow)
{
    // далее идет регистрация оконного  класса...
    WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
    wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wcex.lpfnWndProc = MyWindowProc; // оконная процедура
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN_MENU);
    wcex.lpszClassName = TEXT("MyWindowClass"); // имя класса
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    if (0 == RegisterClassEx(&wcex)) // регистрируем класс
    {
        // не удалось зарегистрировать новый оконный класс
        return -1; // завершаем работу приложения
    } // if
      // загружаем библиотеку 
      // элементов управления общего пользования
    LoadLibrary(TEXT("ComCtl32.dll"));
    // загружаем таблицу быстрых клавиш
    HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
    // создаем главное окно на основе нового оконного класса
    HWND hWnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("Sample1"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if (NULL == hWnd)
    {
        // не удалось создать главное окно
        return -1; // завершаем работу приложения
    } // if
      // создаем задание
    hSampleJob = CreateJobObject(NULL, TEXT("SampleJob"));
    ShowWindow(hWnd, nCmdShow); // отображаем главное окно
                                // далее идет цикл обработки сообщения...
    MSG  msg;
    BOOL bRet;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != FALSE)
    {
        if (bRet == -1)
        {
        /* обработка ошибки и возможно выход из цикла */
        } // if
        else if (!TranslateAccelerator(hWnd, hAccel, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        } // if
    } // while
      // закрываем дескриптор задания
    CloseHandle(hSampleJob);
    return (int)msg.wParam;
} // _tWinMain
  // ------------------------------------------------------------------------------------------------
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);
        HANDLE_MSG(hWnd, WM_SIZE, OnSize);
        HANDLE_MSG(hWnd, WM_COMMAND, OnCommand);
    } // switch
      // передача необработанного сообщения
      // оконной процедуре по умолчанию
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
} // MyWindowProc
  // ------------------------------------------------------------------------------------------------
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
    CreateWindowEx(0, TEXT("Static"), TEXT("Процессы:"), WS_CHILD | WS_VISIBLE | SS_SIMPLE,
        10, 10, 400, 20, hwnd, NULL, lpCreateStruct->hInstance, NULL);
    CreateWindowEx(0, TEXT("Static"), TEXT("Модули:"), WS_CHILD | WS_VISIBLE | SS_SIMPLE,
        420, 10, 400, 20, hwnd, NULL, lpCreateStruct->hInstance, NULL);
    // создаем список для перечисления процессов
    HWND hwndCtl = CreateWindowEx(0, TEXT("ListBox"), TEXT(""), WS_CHILD | WS_VISIBLE | LBS_STANDARD,
        10, 30, 400, 400, hwnd, (HMENU)IDC_LIST_PROCESSES, lpCreateStruct->hInstance, NULL);
    // получаем список процессов
    LoadProcessesToListBox(hwndCtl);
    // создаем список для перечисления загруженных модулей
    CreateWindowEx(0, TEXT("ListBox"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER,
        420, 30, 400, 400, hwnd, (HMENU)IDC_LIST_MODULES, lpCreateStruct->hInstance, NULL);
    return TRUE;
} // OnCreate
  // ------------------------------------------------------------------------------------------------
void OnDestroy(HWND hwnd)
{
    PostQuitMessage(0); // отправляем сообщение WM_QUIT
} // OnDestroy
  // --------------------------------------------------------------
void OnSize(HWND hwnd, UINT state, int cx, int cy)
{
    if (state != SIZE_MINIMIZED)
    {
        // изменяем высоту списка для перечисления процессов
        MoveWindow(GetDlgItem(hwnd, IDC_LIST_PROCESSES), 10, 30, 400, cy - 40, TRUE);
        // изменяем высоту списка для перечисления загруженных модулей
        MoveWindow(GetDlgItem(hwnd, IDC_LIST_MODULES), 420, 30, cx - 430, cy - 40, TRUE);
    } // if
} // OnSize
  // ------------------------------------------------------------------------------------------------
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch (id)
    {
    case IDC_LIST_PROCESSES:
        if (LBN_SELCHANGE == codeNotify) // выбран другой элемент в списке процессов
        {
            // определяем индекс выбранного элемента
            int iItem = ListBox_GetCurSel(hwndCtl);
            if (iItem != -1)
            {
                // определяем идентификатор процесса
                DWORD dwProcessId = (DWORD)ListBox_GetItemData(hwndCtl, iItem);
                // получаем список загруженных модулей
                LoadModulesToListBox(GetDlgItem(hwnd, IDC_LIST_MODULES), dwProcessId);
            } // if
        } // if
        break;
    case ID_PROCESS_RELOAD: // Обновление списка процессов
    {
        HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
        // получаем список процессов
        LoadProcessesToListBox(hwndList);
        // очистим список модулей
        ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
    }
    break;
    case ID_WAITPROCESS: // Ожидание процесса
    {
        DWORD dwMilliseconds = INFINITE;
        HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
        // определяем индекс выбранного элемента в списке процессов
        int iItem = ListBox_GetCurSel(hwndList);
        if (iItem != -1)
        {
            TCHAR szText[] = TEXT("* Для ожидания завершения работы процесса нажмите \"Да\".\r\n \
                                   * Для того, ожидать завершения работы процесса в течении 30 сек. -- \"Нет\".\r\n \
                                   * Для прекращения нажмите \"Отмена\".");
            int mr = MessageBox(hwnd, szText, TEXT("Ожидание процесса"), MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON1);
            switch (mr)
            {
            case IDYES: // ожидание завершения работы процесса
                dwMilliseconds = INFINITE;
                break;
            case IDNO: // ожидание завершения работы процесса в течении 30 сек
                dwMilliseconds = 30000;
                break;
 
            case IDCANCEL: // отмена
                iItem = -1;
                break;
            } // switch
        } // if
        if (iItem != -1)
        {
            DWORD dwProcessId = (DWORD)ListBox_GetItemData(hwndList, iItem); // определяем идентификатор процесса
            // ожидаем завершения работы процесса
            DWORD dwExitCode;
            BOOL bRet = WaitProcessById(dwProcessId, dwMilliseconds, &dwExitCode);
 
            if ((FALSE != bRet) && (STILL_ACTIVE != dwExitCode)) // если процесс был завершен
            {
                MessageBox(hwnd, TEXT("Процесс завершен"), TEXT("Ожидание процесса"), MB_ICONINFORMATION | MB_OK);
                // удаляем процесс из списка
                ListBox_DeleteString(hwndList, iItem);
                // очистим список модулей
                ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
            } // if
            else if (FALSE != bRet) // если истекло время ожидания
            {
                MessageBox(hwnd, TEXT("Истекло время ожидания"), TEXT("Ожидание процесса"), MB_ICONWARNING | MB_OK);
            } // if
            else
            {
                MessageBox(hwnd, TEXT("Возникла ошибка"), NULL, MB_ICONERROR | MB_OK);
            } // else
        } // if
    }
    break;
    case ID_KILLPROCESS: // Завершение процесса
    {
        HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
        // определяем индекс выбранного элемента в списке процессов
        int iItem = ListBox_GetCurSel(hwndList);
        if (iItem != -1)
        {
            int mr = MessageBox(hwnd, TEXT("Завершить процесс?"), TEXT("Завершение процесса"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2);
            if (IDYES != mr) iItem = -1;
        } // if
        if (iItem != -1)
        {
            // определяем идентификатор процесса
            DWORD dwProcessId = (DWORD)ListBox_GetItemData(hwndList, iItem);
            // открываем процесс
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
            BOOL bRet = FALSE;
            if (NULL != hProcess)
            {
                bRet = TerminateProcess(hProcess, 0); // завершаем процесс
                CloseHandle(hProcess);
            } // if
 
            if (FALSE != bRet)
            {
                MessageBox(hwnd, TEXT("Процесс завершен"), TEXT("Завершение процесса"), MB_ICONINFORMATION | MB_OK);
                // удаляем процесс из списка
                ListBox_DeleteString(hwndList, iItem);
                // очистим список модулей
                ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
            } // if
            else
            {
                MessageBox(hwnd, TEXT("Неудалось завершить процесс"), TEXT("Завершение процесса"), MB_ICONWARNING | MB_OK);
            } // else
        } // if
    }
    break;
    case ID_NEWPROCESS: // Создание новых процессов в задании
    {
        TCHAR szFileName[1024] = TEXT("");
        OPENFILENAME ofn = { sizeof(OPENFILENAME) };
        ofn.hwndOwner = hwnd;
        ofn.hInstance = GetWindowInstance(hwnd);
        ofn.lpstrFilter = TEXT("Программы (*.exe)\0*.exe\0");
        ofn.lpstrFile = szFileName;
        ofn.nMaxFile = _countof(szFileName);
        ofn.lpstrTitle = TEXT("Выбор программ");
        ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
        ofn.lpstrDefExt = TEXT("exe");
        if (GetOpenFileName(&ofn) != FALSE) // открываем диалоговое окно для выбора файлов
        {
            BOOL bRet = FALSE;
            // определяем количество выбранных файлов
            UINT nCount = 0;
            for (LPCTSTR p = szFileName; (*p) != 0; p += _tcslen(p) + 1) ++nCount;
            if (nCount-- > 1) // если выбрано несколько файлов
            {
                LPCTSTR lpszName = szFileName + _tcslen(szFileName) + 1;
                // создаём массив строк
                LPTSTR *aCmdLine = new LPTSTR[nCount];
                for (UINT i = 0; i < nCount; ++i)
                {
                    // выделяем память для командной строки
                    aCmdLine[i] = new TCHAR[MAX_PATH];
                    // формируем командную строку
                    StringCchPrintf(aCmdLine[i], MAX_PATH, TEXT("%s\\%s"), szFileName, lpszName);
                    lpszName += _tcslen(lpszName) + 1;
                } // for
 
                  // создаём группу процессов в одном задании
                bRet = StartGroupProcessesAsJob(hSampleJob, (LPCTSTR *)aCmdLine, nCount, FALSE, 0);
                // освобождаем выделенную память
                for (UINT i = 0; i < nCount; ++i) delete[] aCmdLine[i];
                // удаляем массив строк
                delete[] aCmdLine;
            } // if
            else
            {
                LPCTSTR aCmdLine[1] = { szFileName };
                // создаём процесс в одном задании
                bRet = StartGroupProcessesAsJob(hSampleJob, aCmdLine, 1, FALSE, 0);
            } // else
 
            if (FALSE != bRet)
            {
                HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
                // получаем список процессов в созданном задании
                LoadProcessesInJobToListBox(hwndList, hSampleJob);
                // очистим список модулей
                ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
            } // if
            else
            {
                MessageBox(hwnd, TEXT("Возникла ошибка"), NULL, MB_ICONERROR | MB_OK);
            } // else
        } // if
    }
    break;
    case ID_VIEW_PROCESSES_IN_JOB: // Процессы в текущем задании
    {
        HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
        // получаем список процессов в текущем задании
        LoadProcessesInJobToListBox(hwndList);
        // очистим список модулей
        ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
    }
    break;
    case ID_VIEW_NEWPROCESSES_IN_JOB: // Процессы, сгрупированные в задание
    {
        HWND hwndList = GetDlgItem(hwnd, IDC_LIST_PROCESSES);
        // получаем список процессов в созданном задании
        LoadProcessesInJobToListBox(hwndList, hSampleJob);
        // очистим список модулей
        ListBox_ResetContent(GetDlgItem(hwnd, IDC_LIST_MODULES));
    }
    break;
    case ID_PRIORITY: // Изменение приоритета
    {
        // получим дескриптор экземпляра приложения
        HINSTANCE hInstance = GetWindowInstance(hwnd);
        // создаем модальное диалоговое окно для изменения приоритета
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_PRIORITY), hwnd, DialogProc);
    }
    break;
    } // switch
} // OnCommand
  // ------------------------------------------------------------------------------------------------
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_INITDIALOG:
    {
        BOOL bRet = HANDLE_WM_INITDIALOG(hwndDlg, wParam, lParam, Dialog_OnInitDialog);
        return SetDlgMsgResult(hwndDlg, uMsg, bRet);
    }
    case WM_CLOSE:
        HANDLE_WM_CLOSE(hwndDlg, wParam, lParam, Dialog_OnClose);
        return TRUE;
    case WM_COMMAND:
        HANDLE_WM_COMMAND(hwndDlg, wParam, lParam, Dialog_OnCommand);
        return TRUE;
    } // switch
    return FALSE;
} // DialogProc
  // ------------------------------------------------------------------------------------------------
BOOL Dialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    HWND hwndCtl;
    // заполняем выпадающий список "Классы приоритета процесса"
    hwndCtl = GetDlgItem(hwnd, IDC_COMBOBOX_PRIORITY_CLASS);
    constexpr LPCTSTR szPriorityClasses[6] = {
        TEXT("Реального времени"),
        TEXT("Высокий"),
        TEXT("Выше среднего"),
        TEXT("Средний"),
        TEXT("Ниже среднего"),
        TEXT("Низкий")
    };
    constexpr DWORD dwPriorityClasses[6] = {
        REALTIME_PRIORITY_CLASS,
        HIGH_PRIORITY_CLASS,
        ABOVE_NORMAL_PRIORITY_CLASS,
        NORMAL_PRIORITY_CLASS,
        BELOW_NORMAL_PRIORITY_CLASS,
        IDLE_PRIORITY_CLASS
    };
    DWORD dwPriorityClass = GetPriorityClass(GetCurrentProcess());
    for (int i = 0; i < _countof(dwPriorityClasses); ++i)
    {
        int iItem = ComboBox_AddString(hwndCtl, szPriorityClasses[i]);
        ComboBox_SetItemData(hwndCtl, iItem, dwPriorityClasses[i]);
        if (dwPriorityClasses[i] == dwPriorityClass)
        {
            ComboBox_SetCurSel(hwndCtl, iItem);
        } // if
    } // for
      // заполняем выпадающий список "Относительные приоритеты потоков"
    hwndCtl = GetDlgItem(hwnd, IDC_COMBOBOX_PRIORITY);
    constexpr LPCTSTR szPriorities[7] = {
        TEXT("Критичный по времени"),
        TEXT("Максимальный"),
        TEXT("Выше среднего"),
        TEXT("Средний"),
        TEXT("Ниже среднего"),
        TEXT("Минимальный"),
        TEXT("Простаивающий")
    };
    constexpr DWORD dwPriorities[7] = {
        THREAD_PRIORITY_TIME_CRITICAL,
        THREAD_PRIORITY_HIGHEST,
        THREAD_PRIORITY_ABOVE_NORMAL,
        THREAD_PRIORITY_NORMAL,
        THREAD_PRIORITY_BELOW_NORMAL,
        THREAD_PRIORITY_LOWEST,
        THREAD_PRIORITY_IDLE
    };
    DWORD dwPriority = GetThreadPriority(GetCurrentThread());
    for (int i = 0; i < _countof(dwPriorities); ++i)
    {
        int iItem = ComboBox_AddString(hwndCtl, szPriorities[i]);
        ComboBox_SetItemData(hwndCtl, iItem, dwPriorities[i]);
        if (dwPriorities[i] == dwPriority)
        {
            ComboBox_SetCurSel(hwndCtl, iItem);
        } // if
    } // for
    return TRUE;
} // Dialog_OnInitDialog
  // ------------------------------------------------------------------------------------------------
void Dialog_OnClose(HWND hwnd)
{
    EndDialog(hwnd, IDCLOSE);
} // Dialog_OnClose
  // ------------------------------------------------------------------------------------------------
void Dialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch (id)
    {
    case IDOK:
    {
        HWND hwndCtl;
        int iItem;
        // изменим класс приоритета
        hwndCtl = GetDlgItem(hwnd, IDC_COMBOBOX_PRIORITY_CLASS);
        // получим выбранный класс приоритета
        iItem = ComboBox_GetCurSel(hwndCtl);
        DWORD dwPriorityClass = (iItem != -1) ? (DWORD)ComboBox_GetItemData(hwndCtl, iItem) : NORMAL_PRIORITY_CLASS;
        // задаем класс приоритета
        SetPriorityClass(GetCurrentProcess(), dwPriorityClass);
        // изменим относительный приоритет для главного потока
        hwndCtl = GetDlgItem(hwnd, IDC_COMBOBOX_PRIORITY);
        // получим относительный приоритет потока
        iItem = ComboBox_GetCurSel(hwndCtl);
        DWORD dwPriority = (iItem != -1) ? (DWORD)ComboBox_GetItemData(hwndCtl, iItem) : THREAD_PRIORITY_NORMAL;
        // задаем относительный приоритет для главного потока
        SetThreadPriority(GetCurrentThread(), dwPriority);
        EndDialog(hwnd, IDOK);
    }
    break;
    case IDCANCEL:
        EndDialog(hwnd, IDCANCEL);
        break;
    } // switch
} // Dialog_OnCommand
  // ------------------------------------------------------------------------------------------------
void LoadProcessesToListBox(HWND hwndCtl)
{
    // удалим все строки из списка
    ListBox_ResetContent(hwndCtl);
    // получим список идентификаторов всех созданных процессов
    DWORD aProcessIds[1024], cbNeeded = 0;
    BOOL bRet = EnumProcesses(aProcessIds, sizeof(aProcessIds), &cbNeeded);
    if (FALSE != bRet)
    {
        TCHAR szName[MAX_PATH], szBuffer[300];
        for (DWORD i = 0,
            n = cbNeeded / sizeof(DWORD); i < n; ++i)
        {
            DWORD dwProcessId = aProcessIds[i], cch = 0;
            if (0 == dwProcessId) continue;
            // открываем объект ядра "процесс"
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
            if (NULL != hProcess)
            {
                // получаем имя главного модуля процесса
                cch = GetModuleBaseName(hProcess, NULL, szName, _countof(szName));
                CloseHandle(hProcess); // закрываем объект ядра
            } // if
            if (0 == cch)
                StringCchCopy(szName, MAX_PATH, TEXT("Неизвестный процесс"));
            // формируем строку для списка
            StringCchPrintf(szBuffer, _countof(szBuffer), TEXT("%s (PID: %u)"), szName, dwProcessId);
            // добавляем в список новую строку
            int iItem = ListBox_AddString(hwndCtl, szBuffer);
            // сохраняем в новой строке идентификатор процесса
            ListBox_SetItemData(hwndCtl, iItem, dwProcessId);
        } // for
    } // if
} // LoadProcessesToListBox
  // ------------------------------------------------------------------------------------------------
void LoadModulesToListBox(HWND hwndCtl, DWORD dwProcessId)
{
    // удалим все строки из списка
    ListBox_ResetContent(hwndCtl);
    // открываем объект ядра "процесс"
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
    if (NULL != hProcess)
    {
        // определяем размер (в байтах) списка модулей
        DWORD cb = 0;
        EnumProcessModulesEx(hProcess, NULL, 0, &cb, LIST_MODULES_ALL);
        // вычисляем количество модулей
        DWORD nCount = cb / sizeof(HMODULE);
        // выделяем память для списка модулей
        HMODULE *hModule = new HMODULE[nCount];
        // получаем список модулей
        cb = nCount * sizeof(HMODULE);
        BOOL bRet = EnumProcessModulesEx(hProcess, hModule, cb, &cb, LIST_MODULES_ALL);
        if (FALSE != bRet)
        {
            TCHAR szFileName[MAX_PATH];
            for (DWORD i = 0; i < nCount; ++i)
            {
                // получаем имя загруженного модуля
                bRet = GetModuleFileNameEx(hProcess, hModule[i], szFileName, MAX_PATH);
                if (FALSE != bRet) ListBox_AddString(hwndCtl, szFileName); // добавляем в список новую строку
            } // for
        } // if
        delete[]hModule; // освобождаем память
        CloseHandle(hProcess); // закрываем объект ядра
    } // if
} // LoadModulesToListBox
  // ------------------------------------------------------------------------------------------------
void LoadProcessesInJobToListBox(HWND hwndCtl, HANDLE hJob)
{
    // удалим все строки из списка
    ListBox_ResetContent(hwndCtl);
    // получим список идентификаторов всех созданных процессов
    DWORD aProcessIds[1024], cbNeeded = 0;
    BOOL bRet = EnumProcessesInJob(hJob, aProcessIds, sizeof(aProcessIds), &cbNeeded);
 
    if (FALSE != bRet)
    {
        TCHAR szName[MAX_PATH], szBuffer[300];
        for (DWORD i = 0,
            n = cbNeeded / sizeof(DWORD); i < n; ++i)
        {
            DWORD dwProcessId = aProcessIds[i], cch = 0;
            // открываем объект ядра процесса
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
            if (NULL != hProcess)
            {
                // получаем имя главного модуля процесса
                cch = GetModuleBaseName(hProcess, NULL, szName, _countof(szName));
                CloseHandle(hProcess); // закрываем объект ядра
            } // if
            if (0 == cch)
                StringCchCopy(szName, MAX_PATH, TEXT("Неизвестный процесс"));
            // формируем строку для списка
            StringCchPrintf(szBuffer, _countof(szBuffer), TEXT("%s (PID: %u)"), szName, dwProcessId);
            // добавляем в список новую строку
            int iItem = ListBox_AddString(hwndCtl, szBuffer);
            // сохраняем в новой строке идентификатор процесса
            ListBox_SetItemData(hwndCtl, iItem, dwProcessId);
        } // for
    } // if
} // LoadProcessesInJobToListBox
Миниатюры
Ошибка в функции ожидания и запуска   Ошибка в функции ожидания и запуска  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2019, 19:28
Ответы с готовыми решениями:

Ошибка запуска Eclipse. Исчезает ехе файл запуска
Привет всем :P Изучаю С++ на Eclipse. Создал проект Hello World. Нажимаю Run - все хорошо. Меняю немного код , дополняю его , совсем...

Установить таймаут ожидания выполнения функции из DLL
Приветствую знатоков и интересующихся. Суть проблемы: Есть довольно громоздкая библиотека от стороннего разработчика для работы с...

Ошибка: превышено время ожидания (модули)
Юнит: unit program1; interface type matrix = array of real; var a:matrix; procedure MCount(var a:matrix); implementation ...

9
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
18.05.2019, 19:41
Цитата Сообщение от xamelione25 Посмотреть сообщение
Ошибка на скрине
Ну так и ответ на скрине: у тебя отсутствуют реализации функций, подчеркнутых в IDE.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
18.05.2019, 21:00  [ТС]
nonedark2008, у меня проблема с этими ошибками...не собирается решение....я думал что это из-за ошибок выше
Миниатюры
Ошибка в функции ожидания и запуска  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.05.2019, 21:29
Цитата Сообщение от xamelione25 Посмотреть сообщение
nonedark2008, у меня проблема с этими ошибками...не собирается решение....я думал что это из-за ошибок выше
Ну очевидно, что тебя проблема с декларацией waitproceebyid. Покажи код.
И впредь - постарайся обходиться без скриншотов, воспользуйся буфером обмена.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
18.05.2019, 21:35  [ТС]
oleg-m1973,
Вложения
Тип файла: rar WindowsProject3-1.part1.rar (20.00 Мб, 2 просмотров)
Тип файла: rar WindowsProject3-1.part2.rar (1.42 Мб, 3 просмотров)
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
18.05.2019, 22:58
Цитата Сообщение от xamelione25 Посмотреть сообщение
не собирается решение....я думал что это из-за ошибок выше
У тебя в коде отсутствуют реализации функций WaitProcessById, StartGroupProcessesAsJob, EnumProcessesInJob. Без них, понятное дело, ничего работать не будет.
0
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
18.05.2019, 23:48
xamelione25,
0
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
19.05.2019, 00:00
вот тебе мой подарок, сделай из него батник кинь в системную папку запускай из командной строки (у меня из Контекстного меню см. как сделать так здесь в разделе твики реестра)
карочь (запуск из директорий проекта)
kill.bat
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Echo Off
 
REM --- Remove Files ---
 
DEL /F /Q *.plg
DEL /F /Q *.td2
DEL /F /Q *.map
DEL /F /Q *.aps
ATTRIB -h -r -s -a *.suo
DEL /F /Q *.suo
REM DEL /F /Q *.sln
DEL /F /Q *.user
DEL /F /Q *.clw
DEL /F /Q *.opt
DEL /F /Q *.ncb
DEL /F /Q *.@@@
DEL /F /Q *.bak
DEL /F /Q *.res
DEL /F /Q *.obj
DEL /F /Q *.csm
DEL /F /Q *.dsw
DEL /F /Q *.ilc
DEL /F /Q *.ild
DEL /F /Q *.ilf
DEL /F /Q *.ils
DEL /F /Q *.mbt
DEL /F /Q *.mrt
DEL /F /Q *.obr
DEL /F /Q *.rv
DEL /F /Q *.tds
DEL /F /Q *.~de


Добавлено через 1 минуту
я ошибся не *.SLN а *.SUO
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
19.05.2019, 08:58  [ТС]
nonedark2008, osnu, я еще из второго поста понял что они у меня не реализованы. Я не пойму в каком участке кода и что нужно прописать.... Я по С++ еще как "здравствуй дерево". Все это вообще делается к п.1 в задании
Миниатюры
Ошибка в функции ожидания и запуска  
Вложения
Тип файла: rar WindowsProject3-1.rar (1.90 Мб, 4 просмотров)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.05.2019, 10:16
Цитата Сообщение от xamelione25 Посмотреть сообщение
я еще из второго поста понял что они у меня не реализованы. Я не пойму в каком участке кода и что нужно прописать....
В любом, просто реализуй и всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2019, 10:16
Помогаю со студенческими работами здесь

Пропадают локальные переменные функции после первого запуска функции
Я написал код для расчёта электрического кольца. Я постепенно упрощаю схему параллельными и последовательными операциями. Вот мой код: (...

Ошибка при SQLAdapter.Fill: превышено время ожидания
Здравствуйте! У нас на предприятии есть программа которая собирает инфу с датчиков и сует в базу, есть в ней функция, которая берет данные...

Ошибка HTTP при обращении к серверу. Превышено время ожидания
Здравствуйте! Помогите, пожалуйста разобраться, что можно сделать, чтобы исправить ошибку - При добавлении конфигурации в мобильное...

Не могу подключиться к серверу по FTP ошибка Превышено время ожидания соединения, Ошибка:Невозможно подключиться к серверу
Всем доброго настроения! ПЫтался подключиться через две программы с разных компов (точнее компа было два). Суть: Хостер предоставил мне...

Время ожидания выполнения истекло. Время ожидания истекло до завершения операции, или сервер не отвечает
Всем доброго времени суток! Имею самописную программку, которая на основании отмеченных пользователем критериев генерирует скрипт и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru