写一个程序,然后桌面快捷方式指向我的exe,这样双击快捷方式的时候就会启动我的exe,然后由我的exe来启动主程序。同时我的exe也monitor主程序,主程序退出了,我的exe程序也跟着退出
原来的CPP如下
#include "Stdafx.h"
#include "Resource.h"
#include "GamePlaza.h"
#include "PlatformFrame.h"
//////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CGamePlazaApp, CWinApp)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CGamePlazaApp::CGamePlazaApp()
{
//设置变量
m_pIDispatch=NULL;
m_pCustomOccManager=NULL;
return;
}
//初始函数
BOOL CGamePlazaApp::InitInstance()
{
__super::InitInstance();
#ifndef _DEBUG
#ifndef RELEASE_MANAGER
//存在判断
bool bPlazaExist=false;
CMutex Mutex(FALSE,szPlazaClass,NULL);
if (Mutex.Lock(0)==FALSE) bPlazaExist=true;
//搜索窗口
CWnd * pWndGamePlaza=CWnd::FindWindow(szPlazaClass,NULL);
if (pWndGamePlaza!=NULL)
{
//设置变量
bPlazaExist=true;
//还原窗口
if (pWndGamePlaza->IsIconic())
{
pWndGamePlaza->ShowWindow(SW_RESTORE);
}
//激活窗口
pWndGamePlaza->SetActiveWindow();
pWndGamePlaza->BringWindowToTop();
pWndGamePlaza->SetForegroundWindow();
}
//结果处理
if (bPlazaExist==true) return FALSE;
#endif
#endif
//环境配置
AfxOleInit();
AfxInitRichEdit2();
InitCommonControls();
AfxEnableControlContainer();
//_CrtSetBreakAlloc(2089);
//随机种子
srand((DWORD)time(NULL));
//设置表名
SetRegistryKey(szProductKey);
//工作目录
TCHAR szDirectory[MAX_PATH]=TEXT("");
CWHService::GetWorkDirectory(szDirectory,CountArray(szDirectory));
#ifndef _DEBUG
#ifndef RELEASE_MANAGER
//更新判断
if(lstrcmp(AfxGetApp()->m_lpCmdLine,TEXT("UPDATED"))!=0)
{
//目标目录
TCHAR szTargetPath[MAX_PATH]=TEXT("");
_sntprintf(szTargetPath,CountArray(szTargetPath),TEXT("%s\Update.exe"),szDirectory);
//启动升级
ShellExecute(NULL,TEXT("open"),szTargetPath,TEXT(""),NULL,true);
return FALSE;
}
#endif
#endif
//安装目录
CWHRegKey RegInstallPath;
RegInstallPath.OpenRegKey(TEXT(""),true);
RegInstallPath.WriteString(TEXT("InstallPath"),szDirectory);
//加载配置
m_ParameterGlobal.LoadParameter();
m_GlobalWebLink.LoadPaltformLink();
m_UserInformation.LoadInformation();
m_ExpressionManager.LoadExpression();
//设置目录
SetCurrentDirectory(szDirectory);
m_SkinResourceManager.SetSkinResource(m_ParameterGlobal.m_SkinRenderInfo);
//创建对象
m_pIDispatch=new CImpIDispatch;
m_pCustomOccManager=new CCustomOccManager;
AfxEnableControlContainer(m_pCustomOccManager);
//创建组件
if (m_FaceItemControlModule.CreateInstance()==false) return false;
if (m_UserOrderParserModule.CreateInstance()==false) return false;
if (m_PlatformResourceModule.CreateInstance()==false) return false;
//用户元素
m_UserItemElement.SetUserOrderParser(m_UserOrderParserModule.GetInterface());
m_UserItemElement.SetFaceItemControl(m_FaceItemControlModule.GetInterface());
//平台资源
m_PlatformResourceModule->LoadDefaultResource(TEXT("PlatformConfig.xml"),GetModuleHandle(NULL));
//变量定义
WNDCLASS WndClasss;
ZeroMemory(&WndClasss,sizeof(WndClasss));
//注册窗口
WndClasss.style=CS_DBLCLKS;
WndClasss.hIcon=LoadIcon(IDR_MAINFRAME);
WndClasss.lpfnWndProc=DefWindowProc;
WndClasss.lpszClassName=szPlazaClass;
WndClasss.hInstance=AfxGetInstanceHandle();
WndClasss.hCursor=LoadStandardCursor(MAKEINTRESOURCE(IDC_ARROW));
if (AfxRegisterClass(&WndClasss)==FALSE) AfxThrowResourceException();
//建立窗口
CPlatformFrame * pPlatformFrame=new CPlatformFrame();
pPlatformFrame->Create(szPlazaClass,szProduct,WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_SYSMENU,CRect(0,0,0,0));
//设置变量
m_pMainWnd=pPlatformFrame;
//声音引擎
m_D3DSound.CreateD3DSound(m_pMainWnd->GetSafeHwnd());
return TRUE;
}
//退出函数
INT CGamePlazaApp::ExitInstance()
{
//保存配置
m_ParameterGlobal.SaveParameter();
//删除对象
SafeDelete(m_pIDispatch);
SafeDelete(m_pCustomOccManager);
return __super::ExitInstance();
}
//////////////////////////////////////////////////////////////////////////////////
//应用程序对象
CGamePlazaApp theApp;
//////////////////////////////////////////////////////////////////////////////////
记得你问过类似的问题。
启动程序可以用CreateProcess Api。
检测进程就是开线程周期性遍历当前进程列表,ProcessFirst,ProcessNext
写一个中间层,快捷方式指向你的中间层,你的中间层再调用ShellExecuteEx或者CreateProcess运行那两个程序
至于说监控进程退出的方法,我能想到的有三种:
1。创建一个timer,不停的用ToolHelp遍历进程,发现目标进程退出了就退出。
有点:方便同时检测多个进程退出
缺点:浪费CPU时间,减慢系统整体运行速度,可以看做“不友好的程序”
2。使用WaitForSingleObject等待进程内核对象销毁,进程是一个内核对象,通过等待create时系统返回的进程句柄,可以在进程退出时恢复等待线程,方便退出
优点:由于等待时程序进入“阻塞”状态,不会浪费CPU,节省资源
缺点:如果被监视的进程需要创建子进程,而需要等待所有子进程退出,就不好弄了。
3。利用作业机制
优点:克服了方法1和方法2的所有缺点
缺点:资料太少,编写难度较大