Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как узнать имя процесса?


Автор: Erick 23.6.2005, 22:10
Следующей функцией я вывожу следующую информацию о процессе(запущеный блокнот, калькулятор и т.д.): дескриптор процесса, идентификатор процесса, дескриптор и идентификатор первичного потока, код завершения процесса.
Код

BOOL CALLBACK fDlgInfo(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    PROCESS_INFORMATION *lpPi = NULL;
    HANDLE              hProcess = NULL;
    DWORD               ExitCode = 0;

    switch (uMsg)
    {
    case WM_INITDIALOG:
        {
            lpPi = (PROCESS_INFORMATION*)lParam;
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, lpPi->dwProcessId);
            
            // Prc id, Prc handle
            SetIntText(hwndDlg, IDC_STATIC_PH, (DWORD)lpPi->hProcess);
            SetIntText(hwndDlg, IDC_STATIC_PI, (DWORD)lpPi->dwProcessId);
            // Thr id, Thr handle
            SetIntText(hwndDlg, IDC_STATIC_TH, (DWORD)lpPi->hThread);
            SetIntText(hwndDlg, IDC_STATIC_TI, (DWORD)lpPi->dwThreadId);
            // Prc ExitCode
            if (GetExitCodeProcess(hProcess, &ExitCode))
            {
                if (ExitCode==STILL_ACTIVE)
                {
                    HWND hItem = NULL;
                    hItem = GetDlgItem(hwndDlg, IDC_STATIC_P_EXIT);
                    SendMessage(hItem, WM_SETTEXT, 0L, (LPARAM)"Активен\0");
                } else
                    SetIntText(hwndDlg, IDC_STATIC_P_EXIT, (DWORD)ExitCode);
            } else
            {
                LPVOID lpMsgBuf;
                HWND hItem = NULL;

                FormatMessage( 
                    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                    FORMAT_MESSAGE_FROM_SYSTEM | 
                    FORMAT_MESSAGE_IGNORE_INSERTS,
                    NULL,
                    GetLastError(),
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    (LPTSTR) &lpMsgBuf,
                    0,
                    NULL 
                );
                hItem = GetDlgItem(hwndDlg, IDC_STATIC_P_EXIT);
                SendMessage(hItem, WM_SETTEXT, 0L, (LPARAM)lpMsgBuf);
                LocalFree( lpMsgBuf );
            }
            CloseHandle(hProcess);
            return true;
        }
    case WM_COMMAND:
     
    case IDOK:
    case IDCANCEL:{EndDialog(hwndDlg, true);return true;}
    }
    return false;
}

В обработчике WM_COMMAND оконнной процедуры создание диалогового окна будет выглядеть след образом:
Код

///////////////////////////////////////////////////////////////
/////////////////Информация о процессе 0///////////////////////
            case IDM_INFO_P0:
                {
                  DialogBoxParam((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
                        MAKEINTRESOURCE(IDD_PROCESS_INFO), hWnd, fDlgInfo,
                        (LPARAM)&pi[0]);

                }break;
///////////////////////////////////////////////////////////////

Но мне надо, чтобы на это диалоговое окно выводилось и имя процесса(программы). Нипример: Notepad.exe. Как это сделать? Где храниться имя программы(pszApplicationName)? Или всё придётся делать вручную?

Автор: Romikgy 24.6.2005, 10:25
Или попробуй GetModuleFileName, или же перебором всего что дает CreateToolhelp32Snapshot с параметром TH32CS_SNAPPROCESS, там в структуре PROCESSENTRY32 есть такая весчь char szExeFile[MAX_PATH]; вот это и есть имя процесса smile
Не знаю как в VC а дельфи и с++ от борланда есть такая весчь Application.ExeName, это по второму вопросу smile

Автор: Romikgy 24.6.2005, 10:46
Не GetModuleFileName не подойдет , если только процесс не dll !

Автор: JoyEx 24.6.2005, 18:31
Код

        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName) );
        }


Автор: Erick 24.6.2005, 22:22
Всем спасибо, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)