Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2009, 17:37   #1
Flammpanzer
 
Регистрация: 02.09.2009
Сообщений: 6
По умолчанию Пытаюсь получить список процессов...

Сабж, а вылетает с ошибкой 5 (Access Denied) при выполнении EnumProcesses()

Подскажите, пожалуйста, что и где в моём быдлокоде на C неправильно написано..

Код:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>

int main ()
    {
        DWORD aProcesses[1024], cbNeeded;
        EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded );
        return 0;
    }
Ide Code:Blocks, ОС WinXP компилятор gcc

И ещё просьба, не советуйте КОММЕРЧЕСКИХ программных продуктов, у нас на предприятии с "пираткой" строго, а покупать ради прораммирования 2 раза в месяц смысла никакого нет..
Flammpanzer вне форума Ответить с цитированием
Старый 04.09.2009, 12:30   #2
AndreyMust19
Пользователь
 
Регистрация: 01.03.2009
Сообщений: 31
По умолчанию

Все вроде бы правильно. Проверьте значение, возвращаемое EnumProcesses. Если истина - значит ошибок нет, если ложь - надо проверить GetLastError.
Код:
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return 0;
Если программа во время работы экстренно завершается с ошибкой Access Violantion (0xC0000005 вроде бы), то тут можно уповать только на глючность компилятора / линкера. Попробуйте имзенить опции компиляции. Можно попробовать другой бесплатный компилятор / линкер. Ulink знаю точно.
AndreyMust19 вне форума Ответить с цитированием
Старый 04.09.2009, 13:19   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А через ToolHelp32SnapShot не хочется получать список?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2009, 22:05   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Под рукой нет MSDN, но есть стойкое ощущение, что в первом параметре нужно принудительно передавать указатель:
Цитата:
EnumProcesses( &aProcesses, sizeof(aProcesses), &cbNeeded );
Возможно компилятор передает в качестве первого параметра нулевой элемент массива.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 05.09.2009, 07:44   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от alexcoder Посмотреть сообщение
Под рукой нет MSDN, но есть стойкое ощущение, что в первом параметре нужно принудительно передавать указатель:

Возможно компилятор передает в качестве первого параметра нулевой элемент массива.
К слову, в MSDN без & что и удивило меня. Но может быть gcc так и делает, хотя вроде стандарт.
BOBAH13 вне форума Ответить с цитированием
Старый 05.09.2009, 12:24   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
К слову, в MSDN без & что и удивило меня.
Да в общем-то логично. Тип &aProcesses - DWORD(*)[1024], тип aProcesses - DWORD*. Если писать &aProcesses, то будет
cannot convert `DWORD (*)[1024]' to `DWORD*' for argument `1' to `BOOL EnumProcesses(DWORD*, DWORD, DWORD*)'
Somebody вне форума Ответить с цитированием
Старый 07.09.2009, 07:06   #7
Luke
Пользователь
 
Аватар для Luke
 
Регистрация: 12.10.2007
Сообщений: 32
По умолчанию

Код:
BOOL WINAPI EnumProcesses(
  DWORD* pProcessIds,
  DWORD cb,
  DWORD* pBytesReturned
);
Корректный вызов:
EnumProcesses( &aProcesses, sizeof(DWORD) * 1024, &cbNeeded );
А вы передаете вторым указателем 4 байта - размер указателя. А надо размер дворда на кол-во элементов.
Si vis pacem, para bellum!
Luke вне форума Ответить с цитированием
Старый 07.09.2009, 18:27   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Luke Посмотреть сообщение
А вы передаете вторым указателем 4 байта - размер указателя. А надо размер дворда на кол-во элементов.
Вообще-то sizeof даёт как раз размер массива.
Exceptions where arrays are not treated as a pointer
Somebody вне форума Ответить с цитированием
Старый 07.09.2009, 21:00   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Visual Studio 2008 попросил только либу прилинковать, а так все работает

Код:
#pragma comment(lib,"Psapi.lib")
ERROR_ACCESS_DENIED - доступ запрещен

наверно gcc глюкает или какой-то процесс не хочет чтоб его нашли...
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список процессов? SoLL Win Api 19 28.01.2012 09:52
как получить список запущенных процессов на компе One.Love Win Api 10 17.03.2009 01:36
Список процессов на удаленном компьютере Роман Радер Работа с сетью в Delphi 2 22.01.2009 02:52
Получить список папок Иллидан Общие вопросы Delphi 1 22.03.2008 15:24