首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么在程序中关闭另一执行程序

2012-07-20 
如何在程序中关闭另一执行程序我做了个升级程序 在主程序中我调用升级程序WinExec(update.exe, SW_SHOW)

如何在程序中关闭另一执行程序
我做了个升级程序 在主程序中我调用升级程序
WinExec("update.exe", SW_SHOW);  
PostQuitMessage(WM_QUIT); //关闭主程序

在升级程序中,我发现主程序没关闭,
  HWND hwnd = ::FindWindow(NULL,"程序");  
  ::SendMessage(hwnd,WM_CLOSE,0,0); 
执行这个,发现程序也没关闭掉,那位高手知道办法,最好给个具体使用的示例,谢谢

[解决办法]
WM_CLOSE是关闭窗口的消息,实际的程序并未关闭,你再看看别的消息先.
[解决办法]
你那个窗口Find到了么??

另外,你这不是想在主程序中退出么??如果不需要考虑退出析构什么的可以直接调用exit(0)

如果你还想在升级程序中关闭主程序,你可以在启动升级程序的时候把自己的进程id传给它,在升级程序中就可以用TerminateProcess强行终止主程序
[解决办法]
查找--关闭
看另一程序有无调用的接口,比如释放内存等
[解决办法]
HWND hwnd = ::FindWindow(NULL,"程序"); 这个句柄是否为空
[解决办法]
如果要关闭自己,就写个exit(1);
如果要关闭别人,就拿到那个进程的id ,然后发送一个消息,哪个进程接收到消息后 ,exit(1);

你看看,多好。

当然,postmessage(quit);也可以,但是要明确把消息传递给哪个进程id。
[解决办法]

C/C++ code
DWORD CProcessRuntime::GetProcessId( LPCSTR lpProcessName ){    PROCESSENTRY32 pe32;    pe32.dwSize = sizeof(PROCESSENTRY32);    HANDLE hFindProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,NULL);    if(hFindProcess == INVALID_HANDLE_VALUE)    {        return 0;    }    DWORD dwProcessId = 0;    BOOL bAction = ::Process32First(hFindProcess ,&pe32);    CHAR szBuffer[MAX_PATH] = {0};    CHAR szProcessName[MAX_PATH] = {0};    strcpy_s(szProcessName ,sizeof(szProcessName) ,lpProcessName);    _strlwr_s(szProcessName);    while (bAction)    {        bAction = ::Process32Next(hFindProcess ,&pe32);        WideCharToMultiByte(CP_ACP ,0 ,pe32.szExeFile ,-1 ,szBuffer ,1000 ,NULL ,NULL);        _strlwr_s(szBuffer);        if(!strcmp(szBuffer ,szProcessName))        {            dwProcessId = pe32.th32ProcessID;            break;        }    }    ::CloseHandle(hFindProcess);    return dwProcessId;}BOOL CProcessRuntime::CloseProcess( LPCSTR lpProcessName ){    BOOL bIsWork = FALSE;    DWORD dwProcessId = GetProcessId(lpProcessName);    if(dwProcessId != 0)    {        HANDLE hCloseProcess = ::OpenProcess(PROCESS_TERMINATE ,FALSE ,dwProcessId);        if(hCloseProcess != INVALID_HANDLE_VALUE)        {            ::TerminateProcess(hCloseProcess ,0);            ::CloseHandle(hCloseProcess);            bIsWork = TRUE;        }    }    return bIsWork;}//调用xxxx->CloseProcess("iexplorer.exe");
[解决办法]
探讨

C/C++ code

DWORD CProcessRuntime::GetProcessId( LPCSTR lpProcessName )
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hFindProcess = ::CreateToolhelp32Snapshot(TH32……

[解决办法]
暴力点就是直接杀对方进程。如下面暴力关闭Excel.
C/C++ code
STDMETHODIMP  CMyControl::KillAllExcel(){     HANDLE   hSnapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);     if(   hSnapshot   ==   (HANDLE)-1   )   {         ODS("CreateToolhelp32Snapshot()   Failed!\n ");         return   S_FALSE;    }     PROCESSENTRY32   pe;     ZeroMemory(&pe,sizeof(pe));     pe.dwSize   =   sizeof(pe);     bool lbFind=false;     BOOL   bMore   =   Process32First(hSnapshot,&pe);       while(bMore){           HANDLE   hProcess   =   ::OpenProcess(             PROCESS_TERMINATE,             FALSE,pe.th32ProcessID);         CHAR str[260], *p;        lstrcpy(str,pe.szExeFile);        p = strupr(str);                if   ( lstrcmp(p, "EXCEL.EXE") ==0   )   {              TerminateProcess(hProcess,0);               ODS("Killed All Excel Process.\n");             lbFind = true;        }         bMore   =   Process32Next(hSnapshot,&pe);     }     CloseHandle(hSnapshot);     if ( !lbFind)    {            ODS("Not Found Excel Process.\n ");         return S_FALSE;    }        return S_OK;} 

热点排行