Есть проект. при компиляции ошибок не дает, при запуске приложения непосредственно из Builder все отлично работает. При запуске exe вручную не работает одна из функций (завершение процесса Explorer.exe). Нужные галочки в настройках проекта сняты, компилировал в режимах и debug, иrelease.
Никакого эффекта.
Может кто подскажет что с этим делать? заранее спасибо))
10 апреля 2009 в 20:02
хм…вобщем если кому интересно ошибка была в функции OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); где вместо ALL_ACCESS следовало написать TERMINATE.
8 апреля 2009 в 23:03
ммм честно говоря ниче не понято, как так не добавляется библиотекаtlhelp32? такой вообще нет, TooolHelpAPI насколько я понимаю находяться в Kernel32.dll
Посмотрите какой PID процесса вертает GetProcessByExeName()
ну и так далее смотрите
8 апреля 2009 в 23:03
спасибо) завтра буду разбираться) о результатах напишу)
8 апреля 2009 в 23:02
значит все более менее понятно, при компиляции не добавляется библиотека tlhelp32…
8 апреля 2009 в 23:01
выдает код ошибки 6…
8 апреля 2009 в 23:01
6 ERROR_INVALID_HANDLEThe handle is invalid.
Выходит неправильно получаете хендл процесса, хм..
8 апреля 2009 в 23:00
а почему сложно опередлить?
пишем что то типа:
int res = TerminateProcess(…);
if(!res) ShowMessage(GetLastError());
смотрим код ошибки в МСДН, может полезное че скажет.
Попробуйте, мне теперь тоже интересно в чем причина это проблемы))))
8 апреля 2009 в 22:05
виндовс хр, на разных виртуальных машинах.
что выдают определить сложно, так как в режиме отладки все работает правильно, а при запуске из проводника никаких ошибок не выдается, данная функция просто не работает, хотя остальная программа работает.
с правами почти исключено, так как процесс имеет права что и запустивший его пользователь, у которогоесть право остановитьexplorer.
8 апреля 2009 в 22:04
все то же самое, ни из cmd, ни из far. Похоже это именно из-за компилятора, но все настройки уже перекопал, все однои тоже.
8 апреля 2009 в 22:04
а при чем тут компилятор?
может все таки права? под какой виндой? что возвращает TreminateProcess и потом GetLastError()?
8 апреля 2009 в 22:03
ну кстати моё предположение легко проверить, запустив вашу убивалку из cmd.exe или какого нить файл менеджера
8 апреля 2009 в 22:01
"При запуске exe вручную" – это двойной клик в проводнике?
Если так – то разница в родительском процессе. В одном случае это билдер, в другом сам эксплорер, может есть ограничения на убийство родительского процесса(правда я не слышал о таком). Или дело в правах вашего процеса.
А как убиваете процесс?
8 апреля 2009 в 22:01
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;
}