Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenProcess failed with error 18 
V
    Опции темы
бУРов
Дата 29.11.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Код
#include "stdafx.h"
#include <atlstr.h>

//  Forward declarations:
void printError( char* msg );
TCHAR module_name[MAX_PATH];
DWORD dwSize = sizeof(module_name)/sizeof(TCHAR) - 1;
CString ProcName;
LPTSTR ProcPath;

BOOL CheckProcess( char* ParName )
{
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;

    ProcPath="";
    // Take a snapshot of all processes in the system.
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( hProcessSnap == INVALID_HANDLE_VALUE )
    {
        printError("CreateToolhelp32Snapshot (of processes)");
        return( FALSE );
    }

    // Set the size of the structure before using it.
    pe32.dwSize = sizeof( PROCESSENTRY32 );

    // Получить инфо на первый процесс
    // и выйти, если ошибка
    if( !Process32First( hProcessSnap, &pe32 ) )
    {
        printError("Process32First");
        CloseHandle( hProcessSnap );
        return( FALSE );
    }

    // Для каждого процесса из списка (снимка)
    do
    {
//        printf("%s  %u\n", pe32.szExeFile, pe32.th32ProcessID);
        ProcName = pe32.szExeFile;
        if ( ProcName == ParName )            // процесс найден
        {
            hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pe32.th32ProcessID );
            if( GetLastError() )
            {
                printError("OpenProcess");
                CloseHandle( hProcessSnap );
                return( FALSE );
            }
            break;
        }
    } while( Process32Next( hProcessSnap, &pe32 ) );

    CloseHandle( hProcessSnap );
    return( TRUE );
}

void printError(char* msg)
{
    DWORD eNum;
    char sysMsg[256];
    char* p;

    eNum = GetLastError( );
    FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, eNum,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        sysMsg, 256, NULL );

    // Trim the end of the line and terminate it with a null
    p = sysMsg;
    while( ( *p > 31 ) || ( *p == 9 ) )
    ++p;
    do { *p-- = 0; } while( ( p >= sysMsg ) &&
                            ( ( *p == '.' ) || ( *p < 33 ) ) );

    // Display the message
    printf("\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg);
}

int main(int argc, char *argv[])
{
    while(1)
    {
        CheckProcess( argv[1] );
        printf( "\n%s", ProcName );
        Sleep( 1000 );
    }
    return 0;
}



Программа как-то работает, но найдя нужный мне процесс, при попытке выполнить OpenProcess выводится сообщение:

"WARNING: OpenProcess failed with error 18 (There are no more files)"

Вроде как предупреждение, и программа работает дальше. Эта ошибка вроде говорит, что произошел запрос на процесс, которого уже нет?

Может быть перед OpenProcess нужно привелегий получить?

Заменил проверку
if( GetLastError() )

проверкой
if( hProcess == NULL )
и ошибка не выводится. Только правильно ли так?

"If the function succeeds, the return value is an open handle to the specified process.
If the function fails, the return value is NULL. To get extended error information, call GetLastError."

Вроде, да. Такая проверка также приводится у майкрософта
Taking a Snapshot and Viewing Processes


Это сообщение отредактировал(а) бУРов - 29.11.2013, 09:57
PM MAIL   Вверх
Dem_max
Дата 29.11.2013, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



А ты перед вызовом OpenProcess установил SetLastError(0) ????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 29.11.2013, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Может алгоритм подскажешь?
Задача-то простая, но чет не получается у меня.
Нужно получить путь исполняемого файла. Имя его передается как аргумент.

Я так мыслю.
Сначала CreateToolhelp32Snapshot для процессов
Иду по списку процессов.
Если нахожу процесс с именем таким же как в параметре, то

CreateToolhelp32Snapshot для модулей
Иду по списку модулей.

И тут мне нужно остановиться только на нужном модуле и вытянуть путь me32.szExePath

Но не получается никак.
------
Вроде что-то получилось. Сравниваю название процесса с названием модуля. Если совпадают, то вытаскиваю путь

Это сообщение отредактировал(а) бУРов - 29.11.2013, 11:41
PM MAIL   Вверх
Dem_max
Дата 29.11.2013, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Смотри предпоследнюю свою тему, а в ней опять я тебя вернул на твою же летнюю тему в которой все есть.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.