Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
14 / 15 / 2
Регистрация: 21.04.2012
Сообщений: 192
1

Вывод дескрипторов процесса в окна

13.11.2012, 14:38. Просмотров 3829. Ответов 5
Метки нет (Все метки)

Нужно вывести дескрипторы процесса из структуры:
C++
1
2
3
4
5
6
typedef struct _PROCESS_INFORMATION { 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION;
При попытках это сделать вылетает ошибка:
Необработанное исключение по адресу 0x74ACD298 (user32.dll) в ОС Лаба 1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000224.

C++
1
MessageBox(NULL,(LPCSTR) ProcessInformation[ProcessNumber].hProcess, "Дескриптор недавно созданного процесса..", MB_ICONINFORMATION);
Как исправить данную проблему?

P.S. В консольном приложении всё отлично выводилось через cout...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2012, 14:38
Ответы с готовыми решениями:

Получить список Дескрипторов диалогового окна
Доброго времени суток :) Не знаю как правильно задать вопрос :( Но смысл в том что есть функция...

Re: Перерисовка окна из другого процесса
Нужно вызвать перерисовку окна из другого процесса. #include ...... int _tmain(int argc,...

Получение HWND окна по дескриптору процесса
Помогите пожалуйста, мне надо узнать хэндл окна по дескриптору процесса, возможно ли вообще это...

Получить идентификатор процесса по имени окна
Нужно получить PID именно процесса(не потока) по заданному имени окна(того, что отображается в...

5
2819 / 1629 / 252
Регистрация: 03.12.2007
Сообщений: 4,223
13.11.2012, 17:39 2
Ты пытаешься вывести строку по адресу ProcessInformation[ProcessNumber].hProcess. Если этот хэндл на что-то и указывает, то точно не на строку символов.
0
14 / 15 / 2
Регистрация: 21.04.2012
Сообщений: 192
14.11.2012, 23:21  [ТС] 3
Цитата Сообщение от Somebody Посмотреть сообщение
Ты пытаешься вывести строку по адресу ProcessInformation[ProcessNumber].hProcess. Если этот хэндл на что-то и указывает, то точно не на строку символов.
А почему тогда через консоль всё выводится?
0
Миниатюры
Вывод дескрипторов процесса в окна   Вывод дескрипторов процесса в окна  
14 / 15 / 2
Регистрация: 21.04.2012
Сообщений: 192
19.11.2012, 02:38  [ТС] 4
Так как же можно вывести информацию о запущенном процессе?

Почему этот код работает?
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
#include <windows.h>
#include <iostream>
using namespace std;
int main()
 {setlocale(LC_ALL, "Russian");
 STARTUPINFO cif;
 
ZeroMemory(&cif,sizeof(STARTUPINFO) );
 
PROCESS_INFORMATION pi;PROCESS_INFORMATION pi1;PROCESS_INFORMATION pi2;
 
CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi);
cout<<"Открываем приложение Блокнот"<<endl;
   cout <<"Инфо. о процессе:" << endl;
   cout <<"\tДескриптор недавно созданного процесса:" << pi.hProcess<<endl;
   cout<<"\tДескриптор первичного потока недавно созданного процесса:"<<pi.hThread<<endl;
   cout<<"\tЗначение, используемое для идентификации процесса:"<<pi.dwProcessId<<endl;
   cout<<"\tЗначение, используемое для идентификации потока:"<<pi.dwThreadId<<endl;
   system("pause");
   //**********************************************************************************************
CreateProcess("c:\\windows\\system32\\mspaint.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi1);
cout<<"Открываем приложение Paint"<<endl;
   cout <<"Инфо. о процессе:" << endl;
   cout <<"\tДескриптор недавно созданного процесса:" << pi1.hProcess<<endl;
   cout<<"\tДескриптор первичного потока недавно созданного процесса:"<<pi1.hThread<<endl;
   cout<<"\tЗначение, используемое для идентификации процесса:"<<pi1.dwProcessId<<endl;
   cout<<"\tЗначение, используемое для идентификации потока:"<<pi1.dwThreadId<<endl;
   system("pause");
   //**********************************************************************************************
CreateProcess("c:\\windows\\system32\\msinfo32.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi2);
 cout<<"Открываем приложение Информауия о системе"<<endl;
   cout <<"Инфо. о процессе:" << endl;
   cout <<"\tДескриптор недавно созданного процесса:" << pi2.hProcess<<endl;
   cout<<"\tДескриптор первичного потока недавно созданного процесса:"<<pi2.hThread<<endl;
   cout<<"\tЗначение, используемое для идентификации процесса:"<<pi2.dwProcessId<<endl;
   cout<<"\tЗначение, используемое для идентификации потока:"<<pi2.dwThreadId<<endl;
   system("pause");
   //*********************************************************************************************
 cout<<"Далее закроим их в порядке создания."<<endl;
 system("pause");  
    TerminateProcess(pi.hProcess, 0);
 system("pause");
    TerminateProcess(pi1.hProcess, 0);
 system("pause");   
    TerminateProcess(pi2.hProcess, 0);  
cout<<"Приложения закрыты."<<endl;
    system("pause");
 }
А в окна не удаётся вывести.
0
Brainsbreaker
892 / 370 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
19.11.2012, 02:55 5
C++
1
2
3
4
TCHAR textBuffer[128];
 
wsprintf (textBuffer, "Дескриптор недавно созданного процесса: 0x%08X", pi.hProcess);
MessageBox (0, textBuffer, "", MB_ICONINFORMATION);
1
14 / 15 / 2
Регистрация: 21.04.2012
Сообщений: 192
21.11.2012, 02:02  [ТС] 6
Цитата Сообщение от Digit@ll Посмотреть сообщение
C++
1
2
3
4
TCHAR textBuffer[128];
 
wsprintf (textBuffer, "Дескриптор недавно созданного процесса: 0x%08X", pi.hProcess);
MessageBox (0, textBuffer, "", MB_ICONINFORMATION);
Сделал так. Тепер выводится не дескриптор, а нули(0x00000000).
В чём проблема?

Добавлено через 20 минут
Вот код:
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
// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
 
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <iostream>
#define but1 19
#define but2 29
#define but3 39
#define but4 79
//#define edit 60
//#define pluspr 40
//#define minuspr 50
//#define stat 60
// Global variables
 
 
WCHAR buf[1024]={0};
int ProcessNumber = 0;
const int Max = 100;
//**********
static HWND  hPlusprocess,hMinusprocess,hstat,button1,button2,button3,button4;
//********
const UINT ID_PLUSPR = 40;
const UINT ID_MINUSPR = 50;
const UINT ID_EDIT = 60;
const UINT ID_STAT = 70;
 
//HANDLE procnow[Max];
 
static HWND hedit;
 
STARTUPINFO StartupInfo;
 PROCESS_INFORMATION ProcessInformation[Max];
// The main window class name.
static TCHAR szWindowClass[] = _T("win32app");
 
// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
 
HINSTANCE hInst;
 
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_BYTEALIGNWINDOW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Call to RegisterClassEx failed!"),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    hInst = hInstance; // Store instance handle in our global variable
 
    // The parameters to CreateWindow explained:
    // szWindowClass: the name of the application
    // szTitle: the text that appears in the title bar
    // WS_OVERLAPPEDWINDOW: the type of window to create
    // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
    // 500, 100: initial size (width, length)
    // NULL: the parent of this window
    // NULL: this application does not have a menu bar
    // hInstance: the first parameter from WinMain
    // NULL: not used in this application
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX,
        CW_USEDEFAULT, NULL,
        330, 500,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    //----------------------------
    CreateWindow(_T("static"),_T("  Запуск процессов"),WS_CHILD | WS_VISIBLE,10,20,140,20,hWnd,NULL,hInstance,NULL);
    CreateWindow(_T("static"),_T("Удаление процессов"),WS_CHILD | WS_VISIBLE,160,20,150,20,hWnd,NULL,hInstance,NULL);
    //******
     button1 = CreateWindow (_TEXT("button"), _TEXT("Добавить процесс"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON|BS_ICON,
 10, 50, 140, 30, hWnd, (HMENU)but1, hInstance, NULL);
 
 HICON hIcon1 = LoadIcon (NULL, IDI_APPLICATION);
SendMessage(button1,BM_SETIMAGE,IMAGE_ICON,(LPARAM)hIcon1);
 
     button2 = CreateWindow (_TEXT("button"), _TEXT("Удалить процесс"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON|BS_ICON,
 160, 50, 140, 30, hWnd, (HMENU)but2, hInstance, NULL);
 
    HICON hIcon2 = LoadIcon (NULL, IDI_ERROR);
SendMessage(button2,BM_SETIMAGE,IMAGE_ICON,(LPARAM)hIcon2);
 
     button3 = CreateWindow (_TEXT("button"), _TEXT("Выход из программы"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 80, 400, 150, 30, hWnd, (HMENU)but3, hInstance, NULL);
 
    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Call to CreateWindow failed!"),
            _T("Win32 Guided Tour"),
            NULL);
 
        return 1;
    }
 
    // The parameters to ShowWindow explained:
    // hWnd: the value returned from CreateWindow
    // nCmdShow: the fourth parameter from WinMain
    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);
 
    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
}
 
//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ 
PAINTSTRUCT ps;
HDC hdc;
//ZeroMemory(&ProcessInformation,sizeof(ProcessInformation) );
//*********
//TCHAR greeting[] = _T("Hello, World!");
 
    switch (message)
    {//----------------------------------------------------------------------------------------
    case WM_COMMAND:
    {
        //--------------------------------------------------------------------------------------------
        
    if (LOWORD(wParam) == ID_MINUSPR)
    {
        
    
        
        if (HIWORD(wParam) ==LBN_DBLCLK)
        {
            int ListI=(int)SendMessage(hMinusprocess,LB_GETCURSEL,0,0);
                                                if(ListI!=LB_ERR)
            { if(TerminateProcess(ProcessInformation[ListI].hProcess, 0)==true)
                                                {
                                                    for(int i = ListI;i<ProcessNumber;i++)
                                                    {
                                                        ProcessInformation[ListI]=ProcessInformation[ListI+1];
                                                    }
                                                }
                   //MessageBox(NULL, "А процесс не удалился то...", "Омг??", MB_ICONINFORMATION);
                   SendMessage (hMinusprocess, LB_DELETESTRING,ListI,NULL);//--ProcessNumber;ZeroMemory(&StartupInfo,sizeof(STARTUPINFO) );
             
             }
        
        }
     }
//-----------------------------------------------------------------------------------------------
      {             
    if(LOWORD(wParam)== but1)
        {
            HWND hstat = CreateWindow(_T("STATIC"), _T("    Путь к файлу"),WS_VISIBLE | WS_CHILD | WS_BORDER
            , 10, 100, 140, 20, hWnd, (HMENU)ID_STAT, hInst, NULL);
        
       hedit = CreateWindow(_T("EDIT"), _T("c:\\windows\\notepad.exe"),WS_CHILD | WS_VISIBLE | WS_BORDER|ES_AUTOHSCROLL
       , 10, 130, 140, 20, hWnd, (HMENU)ID_EDIT, hInst, NULL);
            HWND button4 = CreateWindow (_TEXT("button"), _TEXT("Запуск процесса"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
              10, 160, 140, 30, hWnd, (HMENU)but4, hInst, NULL);
                 
    
        }
         
//-------------------------------------------------------------------------------------------
    if(LOWORD(wParam) == but2)  
        {//TerminateProcess(ProcessInformation[ProcessNumber].hProcess, 0);
            hMinusprocess = CreateWindow(_T("listbox"), NULL, WS_CHILD | WS_VISIBLE| WS_VSCROLL|LBS_WANTKEYBOARDINPUT|WS_BORDER|LBN_SELCHANGE|LBN_DBLCLK,
                         160, 100, 140, 200,hWnd, (HMENU)ID_MINUSPR, hInst, NULL);
        }
//--------------------------------------------------------------------------------------------
    if (LOWORD(wParam) == but3) 
        {
            DestroyWindow(hWnd);
        }
 
    if(LOWORD(wParam) == but4)
        {
            if(ProcessNumber<Max)
        {
              //**************************************
                
            ZeroMemory(&StartupInfo,sizeof(STARTUPINFO) );
 
                
        
                //***************************************************
            //дочернее статическое окно с названием “Параметры процесса ”
            hPlusprocess = CreateWindow("static",NULL, WS_CHILD | WS_VISIBLE|WS_BORDER,
             10, 200, 140, 200,hWnd, (HMENU)ID_PLUSPR, NULL, NULL);
            
                if(hedit){//***********************************************************************
                    GetDlgItemText (hWnd, ID_EDIT, (LPSTR)buf, 1024);}else MessageBox(NULL, "Директория не скопированна.", "Как??", MB_ICONINFORMATION);
    
                    //MessageBox(NULL, (LPCSTR)buf, "Как??", MB_ICONINFORMATION);
 
            if(CreateProcess((LPCSTR)buf,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&StartupInfo,&ProcessInformation[ProcessNumber])==TRUE)
            {    
                       SetWindowText(hPlusprocess,(LPCSTR)buf);
                      SendMessage (hMinusprocess, LB_ADDSTRING, 0, (LPARAM)buf);
//***************************************************************************************
//-------------------------Код Вставки--------------------------------------------------------------------------
                      TCHAR textBuffer[128];
wsprintf ((LPSTR)textBuffer, "Дескриптор недавно созданного процесса: 0x%08X", StartupInfo,ProcessInformation[ProcessNumber].hProcess);
                      MessageBox (0,textBuffer, "", MB_ICONINFORMATION);
//---------------------------------------------------------------------------------------------------------------------
//******************************************************************************************
                          ProcessNumber++;
            }
            else MessageBox(NULL, "Проверьте путь к файлу.", "Неверная директория.", MB_ICONINFORMATION);
           //   c:\\windows\\notepad.exe
    } 
            else MessageBox(NULL, "Слишком много процессов.", "Как??", MB_ICONINFORMATION);
        }
        
        }break; 
//-----------------------------------------------------------------------------------------
 }break;
        
    case WM_PAINT:
        {hdc = BeginPaint(hWnd, &ps);
        hdc = GetDC(hWnd);
        MoveToEx(hdc, 155, 0, NULL);
        LineTo(hdc, 155, 400);
        ReleaseDC(hWnd, hdc);
 
        EndPaint(hWnd, &ps);}
        break;
        //----------------------------------
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
        
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2012, 02:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как получить HWND окна/процесса/консоли
Как получить HWND окна/процесса/консоли? мне надо для Shellexecute. Реализация в Dll #include...

Как получить все дочерние окна процесса?
Получаю все процессы, нахожу нужный, но мне еще нужны вложенные окна типа Ebit и им подобным,...

Как узнать заголовок окна по PID процесса
Тут Я скрываю окно по Заголовку программы. У меня не большой вопрос как узнать Заголовок окна на...

Определить заголовок(имя) окна, зная PID его процесса
Сабж! Уже 2ой день не могу найти - как? У меня известе PID и hwnd процесса, как узнать имя окна(то...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.