ryuken
asked on
api windows + shutdown a process with his handle
Hello,
I have two executables and I want they comunicate themselves with messages.
When I launch the first program, I have a timer witch list all the Windows and I can get their handles. Then, I send every 5 seconds a lots of messages until the second program answer one of them.
When I launch the second program, if it recieves a message, it sends his handle to the first program as a parameter.
In my first program, when I want to terminate the process of the second program with his handle, it doesn't work.
Can you tell me what should I do to terminate the second program with his handle. Is there a API Windows' function as the same as TerminateProcess but with the handle of a Window and not with the handle of a process.
thanks!
I have two executables and I want they comunicate themselves with messages.
When I launch the first program, I have a timer witch list all the Windows and I can get their handles. Then, I send every 5 seconds a lots of messages until the second program answer one of them.
When I launch the second program, if it recieves a message, it sends his handle to the first program as a parameter.
In my first program, when I want to terminate the process of the second program with his handle, it doesn't work.
Can you tell me what should I do to terminate the second program with his handle. Is there a API Windows' function as the same as TerminateProcess but with the handle of a Window and not with the handle of a process.
thanks!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Anyways, another option--a less good one--is to use TerminateProcess() to terminate the other processes. But this is not the best way as it may kill the process at any time, so the process doesn't have an opportunity to do its "clean up", if there is any to be done.
Or as JKR said....
>> Why don't you use the process ID instead
Or, given the window handle he can use GetWindowThreadProcessID() to get the process ID, but I still wouldn't recommend this route, then open the process handle. (or the other process could pass a process handle, then you know it would have sufficient access rights).
Or, given the window handle he can use GetWindowThreadProcessID()
>>or the other process could pass a process handle
Difficult - the handle has to marked as 'inheritable' and duplicated (as you only receive 'pseudohandles' via 'GetCurrentProcess()'). I personally prefer to use the PID...
Difficult - the handle has to marked as 'inheritable' and duplicated (as you only receive 'pseudohandles' via 'GetCurrentProcess()'). I personally prefer to use the PID...
ASKER
thanks nietod for your help and also jkr.
I have tried the solution of nietod with the WM_QUIT message.
When the second program recieve this message, I have call the function Close(). But it doesn't word as well because I always see it with the task manager (Ctlr + Alt + Suppr).
I have a solution when I call the function Application->Terminate(). And it works as well and it doesn't remain in the task manager.
thanks!!!
I have tried the solution of nietod with the WM_QUIT message.
When the second program recieve this message, I have call the function Close(). But it doesn't word as well because I always see it with the task manager (Ctlr + Alt + Suppr).
I have a solution when I call the function Application->Terminate(). And it works as well and it doesn't remain in the task manager.
thanks!!!
ASKER
thanks nietod for your help and also jkr.
I have tried the solution of nietod with the WM_QUIT message.
When the second program recieve this message, I have call the function Close(). But it doesn't word as well because I always see it with the task manager (Ctlr + Alt + Suppr).
I have a solution when I call the function Application->Terminate(). And it works as well and it doesn't remain in the task manager.
thanks!!!
I have tried the solution of nietod with the WM_QUIT message.
When the second program recieve this message, I have call the function Close(). But it doesn't word as well because I always see it with the task manager (Ctlr + Alt + Suppr).
I have a solution when I call the function Application->Terminate(). And it works as well and it doesn't remain in the task manager.
thanks!!!
>>I personally prefer to use the PID...
I don't deal with security issues often (ever?) but I would think tye problem with the PID is you might not be able to open a process handle with the rights to terminate the process, but the process can always pass a handle that has this right. true?
>> I have call the function Close().
What close? what are you closing?
>> it doesn't word as well
Does message loop end?
I don't deal with security issues often (ever?) but I would think tye problem with the PID is you might not be able to open a process handle with the rights to terminate the process, but the process can always pass a handle that has this right. true?
>> I have call the function Close().
What close? what are you closing?
>> it doesn't word as well
Does message loop end?
>>but I would think tye problem with the PID is you might
>>not be able to open a process handle with the rights to
>>terminate the process
Well, if you created the process, it uses the same credentials as the parent, so that hardly anything can go wrong ;-)
>>not be able to open a process handle with the rights to
>>terminate the process
Well, if you created the process, it uses the same credentials as the parent, so that hardly anything can go wrong ;-)
Why don't you use the process ID instead? This way, you'll be able to
HANDLE hProcess;
// open process
hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pid);
if ( isBadHandle( hProcess ) )
printf( "OpenProcess() failed, err = %lu\n", GetLastError() );
else
{
// kill process
if ( ! TerminateProcess( hProcess, (DWORD) -1 ) )
printf( "TerminateProcess() failed, err = %lu\n", GetLastError() );
else
puts( "killed." );
// close handle
CloseHandle( hProcess );
}