Azman7739
Azman7739

Reputation: 11

Windows Mobile 5 - How to kill other application?

currently I’m creating 2 applications (app A and B) for Windows Mobile 5.0 and using Compact Framework 2.0. App A is the main application and B is the sub application.

Now I’m stuck in killing app A. I did tried using OpenNETCF ProcessEntry Kill() function. When calling Kill(), it made the device crash.

I did tried using the SendMessage(hWnd, WM_CLOSE, 0, 0) funct where WM_CLOSE will have the ProcessEntry.ProcessID value and I didn’t assigned any value to hWnd variable. But it didn’t terminate app A. Did I assign the wrong value?

I also did tried using

Process.GetProcessById(processEntry.ProcessID).CloseMainWindow()

, but failed as GetProcessById only accepts int32 value. Note that processEntry.ProcessID value is larger than int32 value and GetProcessByName() is not supported in Compact Framework.

Could you help me in killing app A through app B? Thanks.

Upvotes: 1

Views: 2376

Answers (5)

Azman7739
Azman7739

Reputation: 1

Now I'm taking a different route.

After downloading the patch and put it in a temp folder, I'll do a soft reset using OpenNETCF.WindowsCE.PowerManagement.SoftReset().

App B will be launched upon startup, then it will scan the temp folder and replace app A with the new version.

Upvotes: 0

user195113
user195113

Reputation:

ctacke, I think app A crashes due to some of the running threads are not closed properly or still running at the background as app A will run multiple threads during app B executing the Kill( ) function.

If I use the SendMessage(hWnd, WM_CLOSE, 0, 0) function, it will not crash the device (which is a good thing)... it only closes the form. (app A contains multiple forms eg: frmLogin and frmMainMenu). hmmm maybe I need to point hWnd to the right form...

Upvotes: 0

Quibblesome
Quibblesome

Reputation: 25429

Note that if the application you are trying to kill is holding open ports or other system resources then it might hang on exiting. Ensure everything is effectively disposed when the form closes.

This can be acheived by putting stuff in the:

public void Dispose(bool disposing)
{
}

block of code in the designer of your main form, or if you've chosen a less Windows Form centric architecture then just run your dispose calls following Application.Run(new YourForm()) and it will execute after the application has closed.

If you're feeling really lazy then just setup some destructors (otherwise known as finalizers ~) but be careful about navigating through relationships between managed objects at "destruct" time if you do this as there is no guarantee as to which order objects will be destroyed.

Upvotes: 0

Azman7739
Azman7739

Reputation: 11

Stormenet, I hardcoded the application's name. Then I generate an object to get all the available process using OpenNETCF.ToolHelp.ProcessEntry[ ] = ProcessEntry.GetProcesses();

then in a foreach loop, if the ProcessEntry object eg: processEntry.ExeFile matches with the "applicationName", i shall use processEntry.Kill().

I think you can get the OpenNETCF.ToolHelp dll from the OpenNETCF site.

Upvotes: 1

kgiannakakis
kgiannakakis

Reputation: 104198

You may try native code, using the TerminateProcess function:

processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
success = TerminateProcess(processHandle, 0);

The above code is from a Task Manager at Code Project.

However if you are writing the code for both the applications, it will be better if you designed a communication mechanism between the two applications. In this way you will send a message from app B to app A and app A will kill itself.

Upvotes: 1

Related Questions