淺談如何讓Windows Mobile只運行一個實例
作者:李玉寶
本文將簡單談談如何讓Windows Mobile只運行一個實例,其中主要用到的互斥的概念。文末作者還提出了自己的一些問題,希望大家積極討論。
因為一個項目的需求,要實現程序只有一個實例運行。在網上搜了很久,最后在CSDN上面看到一回復。得到啟示,完成該功能。
主要用的是互斥對象來實現。代碼如下:
- staticclassProgram
- {
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternIntPtrCreateMutex(SECURITY_ATTRIBUTESlpMutexAttributes,boolbInitialOwner,stringlpName);
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternintReleaseMutex(IntPtrhMutex);
- [StructLayout(LayoutKind.Sequential)]
- publicclassSECURITY_ATTRIBUTES
- {
- publicintnLength;
- publicintlpSecurityDescriptor;
- publicintbInheritHandle;
- }
- constintERROR_ALREADY_EXISTS=0183;
- ///<summary>
- ///應用程序的主入口點。
- ///</summary>
- [MTAThread]
- staticvoidMain()
- {
- IntPtrhMutex=CreateMutex(null,false,"StandardWorkMan");
- if(Marshal.GetLastWin32Error()!=ERROR_ALREADY_EXISTS)
- {
- Application.Run(newFormWorkList());
- }
- else
- {
- MessageBox.Show("已經啟動了一個程序,請勿重復打開","系統提示",
- MessageBoxButtons.OKCancel,MessageBoxIcon.Asterisk,MessageBoxDefaultButton.Button1);
- ReleaseMutex(hMutex);
- Application.Exit();
- }
- }
- }
上面代碼完全正常,我的問題是大部分自己很早就寫出來了。只是問題在下面:
- [DllImport("coredll.Dll",SetLastError=true)]
- privatestaticexternintGetLastError();
- .
- if(GetLastError()!=ERROR_ALREADY_EXISTS)
- {
- Application.Run(newFormWorkList());
- }
我用的是平臺調用里面的GetLastError(),結果一直出不來想要的效果。調試時發現無論打開多少個實例,GetLastError()的值一直都是6(INVALID_HANDLE_VALUE)????很不解。望明白的人說明一下。謝謝。
【編輯推薦】
責任編輯:彭凡
來源:
cnblogs