Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
1

Функция не работает

26.03.2015, 05:34. Показов 1086. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <sys/types.h>
#include <direct.h>
#include <string>
#include <windows.h>
#include <conio.h>
#include <tlhelp32.h>
#include <algorithm>
#include <sstream>
#include "../include/md5/md5.h"
using namespace std;
 
DWORD GetParrentPid()
{
    char myid[128];
    _snprintf(myid, sizeof myid, "%i", GetCurrentProcessId());
 
    tagPROCESSENTRY32 proc;
    static HANDLE hSnap=0;
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    Process32First(hSnap, &proc);
    while (Process32Next(hSnap, &proc)){
        if(GetCurrentProcessId() == proc.th32ProcessID){
            return proc.th32ParentProcessID;
        }
    }
}
 
void main(int argc, char **argv){
printf("Parrent pid: %u\n", GetParrentPod());
}
Debug версия работает.
А когда делаю Release то не работает. Игнорирует строки в функции начиная с while.
Хотелось бы знать почему так.
Покопаюсь в настройках проекта. Думаю там проблема.
Но почему в Release версии не работает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2015, 05:34
Ответы с готовыми решениями:

Функция корректно работает в Delphi 7 и не неверно работает в RAD Studio 10
Переписываю свою программу с Delphi 7 под RAD Studio 10. Столкнулся с проблемой - функция в...

Функция cin.get(array, 80) работает в одной программе, но не работает в другой
Добрый день. Я что то совсем запутался, одна и та же функция в одной программе работает, а в...

Стандартная функция delete в Eclipse работает а в AndroidStudio не работает
case R.id.btnDelete: {//Кнопка удаление последнего символа ...

В VS 2015 не работает рекурсивная функция, которая работает в C++Builder
Добрый день! Перенес блок кода из старого учебного проекта под C++Builder, который там всегда...

7
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 06:22 2
А чем инициирован prog? Он ведь инаут, а не просто аут.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
26.03.2015, 09:10 3
Цитата Сообщение от drunkwolfs Посмотреть сообщение
Хотелось бы знать почему так.
потому что перед использованием своей функции - GetParrentPid , нужно повысить привилегии , например вот такой функцией -
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
BOOL GetDebugPriv(PTOKEN_PRIVILEGES ptkpPrev)
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    BOOL bRet;
    ULONG ulRet;
 
    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
        return FALSE;
 
    bRet=LookupPrivilegeValueA(NULL, SE_DEBUG_NAME, &sedebugnameValue);
    if (!bRet)
    {
        CloseHandle(hToken);
        return bRet;
    }
 
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    bRet=AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),ptkpPrev,&ulRet);
 
    CloseHandle(hToken);
 
    return bRet;
}
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
26.03.2015, 15:34  [ТС] 4
Если использовать этот код внутри main, не как функцию, то работает.
в релиз версии срабатывает только если ее вызывать в main.
Сейчас проснусь, покопаюсь немного и если не исправлю то кину больше информации.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
26.03.2015, 15:37 5
Цитата Сообщение от drunkwolfs Посмотреть сообщение
Если использовать этот код внутри main, не как функцию, то работает.
что передаёшь аргументом в функцию ?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
26.03.2015, 15:54 6
Смотрите что творится:
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <tlhelp32.h>
using namespace std;
 
DWORD GetParrentPid()
{
    char myid[128];
    _snprintf(myid, sizeof myid, "%i", GetCurrentProcessId());
 
    tagPROCESSENTRY32 proc;
    static HANDLE hSnap=0;
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    if(!Process32First(hSnap, &proc)) //<------------------------! проверка исправляет ситуацию, 
       cout<<"ERROR before while: "<<GetLastError()<<endl; //Это тоже обязательно. Даже если вне блока выполнения условия. 
    while (Process32Next(hSnap, &proc))
    {
        if(GetCurrentProcessId() == proc.th32ProcessID)
        {
            return proc.th32ParentProcessID;
        }
    }
    cout<<"ERROR after while: "<<GetLastError()<<endl;
    return 0;
}
 
int main(int argc)
{
    printf("Parrent pid: %u\n", GetParrentPid());
    return 0;
}
Что за магия!? Я Думал что не успевает заполнить структуру, ставил Sleep - нет эффекта.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
26.03.2015, 16:13 7
Что я делаю не так ?
Миниатюры
Функция не работает  
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
26.03.2015, 23:06  [ТС] 8
В моем коде при вызове этой функции из другой функции не срабатывал while.
Но из main она работала.
Если создавать debug проект то все работает. Надоело искать в чем косяк.

Я недавно изучаю си++ поэтому пока что лучше не буду это выносить в отдельную функцию, да и нет необходимости в этом. В начале main буду в глобальную переменную писать pid родителя.

Добавлено через 3 минуты
Enno, ERROR before while: 24
ERROR after while: 24

Добавлено через 10 минут
Кому интересно покопаться в этом - могу отправить код в лс.

Добавлено через 3 часа 24 минуты
Все отлично.
Не хватало строчки:
C++
1
proc.dwSize = sizeof( tagPROCESSENTRY32 );
0
26.03.2015, 23:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2015, 23:06
Помогаю со студенческими работами здесь

Как функция работает,в обработчике не работает
В таком виде все прекрасно работает (function ($) { $.fn.percent = function...

Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом
Доброго времени суток. Объясните, почему программа #include &lt;windows.h&gt; #include &lt;imagehlp.h&gt;...

Не работает функция в С++
Всем привет! Вот мне надо написать функцию, которая находит максимальное среди трёх введённых...

Не работает функция
Доброго времени суток, пишу сайт, использую конфигурации сайта в базе mysql... написал функцию для...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru