Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
1

Возврат строки из функции

27.10.2016, 21:44. Показов 1925. Ответов 17

Здравствуйте. Пишу программу для работы с процессами, мне нужно, чтобы в функцию передавался PID, а возвращалось имя, но выводятся краказябры, а точнее "ММ...МММ несколько других символов, не имеющих смысла ММММММММММММММ". Функция рабочая, дело в возврате строки. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char *getProcessNamebyPID(DWORD PID)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pInfo;
    pInfo.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(snapshot, &pInfo))
    {
        while (Process32Next(snapshot, &pInfo))
        {
            if (PID == pInfo.th32ProcessID)
            {
                CloseHandle(snapshot);
                char *c;
                c = pInfo.szExeFile;
                //std::cout << c << '\n'; тут выводит корректно
                return c; //возвращает краказябры
            }
        }
    }
    CloseHandle(snapshot);
    return NULL;
}
Добавлено через 1 минуту
Как доработать код. Заранее спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2016, 21:44
Ответы с готовыми решениями:

Возврат строки из функции
//char perfomers; //char _perfomers; char GetPerfomers(){strcpy(_perfomers,perfomers);return...

Возврат c-style строки из функции
Здравствуйте, пытаюсь решить задачу на степике, но не получается. Поэтому воспользовался Qt и...

Возврат строки из функции по указателю
Здравствуйте. Обьясните пожалуйсто, почему компилятор выдает предупреждение при выполнении...

Возврат 2 значений из функции с одним вызовом этой же функции
Вообщем где то в какой то игре была хукнута одна функция int function(int arg1,int arg2,int...

17
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 21:58 2
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
возвращает краказябры
Возвращает указатель на строку, адрес которой находится в локальной переменной, которая после выхода из этой самой функции "затирается".
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
27.10.2016, 21:59 3
может потому что память для PROCESSENTRY32 pInfo; не выделяется динамически и она удаляется при выходе из метода

Добавлено через 1 минуту
не успел
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:05  [ТС] 4
castaway, Вы предлагаете использовать static?

Добавлено через 49 секунд
Это не помогает.

Добавлено через 1 минуту
А нет... помогло. Спасибо за подсказку.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
27.10.2016, 22:06 5
PROCESSENTRY32 *pInfo = new PROCESSENTRY32; как то так

Добавлено через 21 секунду
ну либо static)
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:06 6
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
castaway, Вы предлагаете использовать static?
Добавлено через 49 секунд
Это не помогает.
Я пока ещё ничего не предлагал чтобы что-то заработало, но могу предложить, например std::string.
Алексей_Либанов, static - плохой подход. Но если вам всё-равно, то и мне всё-равно.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:09  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
static - плохой подход
Почему?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:15 8
...
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:18  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
...
В таком случае как пользоваться std::string для данной цели?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:20 10
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
Почему?
Объяснение зависит от того как вы использовали static. Покажите что вы написали.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:21  [ТС] 11
C++
1
static PROCESSENTRY32 pInfo;
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:21 12
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
В таком случае как пользоваться std::string для данной цели?
Троеточие - это я затёр сообщение, а не игнорирование вопроса.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:24  [ТС] 13
Цитата Сообщение от castaway Посмотреть сообщение
Троеточие - это я затёр сообщение, а не игнорирование вопроса.
Хорошо.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
27.10.2016, 22:24 14
так просто динамически выделить память можна
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:26 15
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
Почему?
Попробуйте такой псевдокод и поймёте.
C++
1
2
3
4
5
6
7
8
9
    ...
 
    char * a = getProcessNamebyPID( A );
    char * b = getProcessNamebyPID( B );
 
    std::cout << a << std::endl;
    std::cout << b << std::endl;
 
    ...
Тут важна последовательность вызовов.
A и B - разные PID.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:30  [ТС] 16
Цитата Сообщение от castaway Посмотреть сообщение
Попробуйте такой псевдокод и поймёте.
Ну... я понял Как решить данную проблему?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
27.10.2016, 22:32 17
Лучший ответ Сообщение было отмечено Алексей_Либанов как решение

Решение

Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
Ну... я понял. Как решить данную проблему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::string getProcessNamebyPID(DWORD PID)
{
    std::string result;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pInfo;
    pInfo.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(snapshot, &pInfo))
    {
        while (Process32Next(snapshot, &pInfo))
        {
            if (PID == pInfo.th32ProcessID)
            {
                result = pInfo.szExeFile;
                break;
            }
        }
    }
    CloseHandle(snapshot);
    return result;
}
1
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
27.10.2016, 22:39  [ТС] 18
castaway, спасибо! Все работает!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2016, 22:39

Возврат строки из функции
ну столкнулся с такой задачей недавно скажите по средствам stdio.h такой трюк не оформить? я...

Возврат строки из функции
Всем привет. Написал следуюущую фунцию для генерации рандомных строк : LPWSTR RandomString(int...

Передача строки в функцию и возврат строки как результата
Короче товарищи замучился я со строками в си, поскольку перешел из delphi там с этим проблем нет. И...

Возврат каретки и перевод строки в приглашении Командной строки
В строке приглашения MS-DOS после вывода всей информации перейти на новую строчку. как это сделать?


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

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

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