singlepost

Компиляция в C++ Builder << На главную или назад  

Есть проект. при компиляции ошибок не дает, при запуске приложения непосредственно из Builder все отлично работает. При запуске exe вручную не работает одна из функций (завершение процесса Explorer.exe). Нужные галочки в настройках проекта сняты, компилировал в режимах и debug, иrelease.
Никакого эффекта.
Может кто подскажет что с этим делать? заранее спасибо))

14 ответов в теме “Компиляция в C++ Builder”

  1. 13
    Сергей Гурин ответил:

    хм…вобщем если кому интересно ошибка была в функции OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); где вместо ALL_ACCESS следовало написать TERMINATE.

  2. 12
    Дмитрий Хасанов ответил:

    ммм честно говоря ниче не понято, как так не добавляется библиотекаtlhelp32? такой вообще нет, TooolHelpAPI насколько я понимаю находяться в Kernel32.dll
    Посмотрите какой PID процесса вертает GetProcessByExeName()
    ну и так далее смотрите

  3. 11
    Сергей Гурин ответил:

    спасибо) завтра буду разбираться) о результатах напишу)

  4. 10
    Сергей Гурин ответил:

    значит все более менее понятно, при компиляции не добавляется библиотека tlhelp32…

  5. 9
    Сергей Гурин ответил:

    выдает код ошибки 6…

  6. 8
    Дмитрий Хасанов ответил:

    6 ERROR_INVALID_HANDLEThe handle is invalid.
    Выходит неправильно получаете хендл процесса, хм..

  7. 7
    Дмитрий Хасанов ответил:

    а почему сложно опередлить?
    пишем что то типа:
    int res = TerminateProcess(…);
    if(!res) ShowMessage(GetLastError());
    смотрим код ошибки в МСДН, может полезное че скажет.
    Попробуйте, мне теперь тоже интересно в чем причина это проблемы))))

  8. 6
    Сергей Гурин ответил:

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

  9. 5
    Сергей Гурин ответил:

    все то же самое, ни из cmd, ни из far. Похоже это именно из-за компилятора, но все настройки уже перекопал, все однои тоже.

  10. 4
    Дмитрий Хасанов ответил:

    а при чем тут компилятор?
    может все таки права? под какой виндой? что возвращает TreminateProcess и потом GetLastError()?

  11. 3
    Дмитрий Хасанов ответил:

    ну кстати моё предположение легко проверить, запустив вашу убивалку из cmd.exe или какого нить файл менеджера

  12. 2
    Дмитрий Хасанов ответил:

    "При запуске exe вручную" – это двойной клик в проводнике?
    Если так – то разница в родительском процессе. В одном случае это билдер, в другом сам эксплорер, может есть ограничения на убийство родительского процесса(правда я не слышал о таком). Или дело в правах вашего процеса.
    А как убиваете процесс?

  13. 1
    Сергей Гурин ответил:

    1. да, из проводника
    2. процесс убивается функцией TerminateProcess(hProcess, 1);
    до этого получается HANDLE функцией hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

    для рассчета PID функция:

    DWORD GetProcessByExeName(AnsiString ExeN)
    {
    DWORD id;
    HANDLE hProcessSnap = NULL;
    PROCESSENTRY32 pe32 = {0};
    AnsiString temp="";
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    pe32.dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32)) temp = pe32.szExeFile;
    pe32.dwSize=sizeof(PROCESSENTRY32);
    while(Process32Next(hProcessSnap,&pe32))
    {
    temp = pe32.szExeFile;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (temp == ExeN)
    {
    id = pe32.th32ProcessID;
    CloseHandle(hProcessSnap);
    return id;
    }
    }
    CloseHandle(hProcessSnap);
    MessageBox(NULL, "Процесс не найден!", "!", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
    return false;
    }

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.