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

解决方案 »

  1.   

    WM_CLOSE是关闭窗口的消息,实际的程序并未关闭,你再看看别的消息先.
      

  2.   

    你那个窗口Find到了么??另外,你这不是想在主程序中退出么??如果不需要考虑退出析构什么的可以直接调用exit(0)如果你还想在升级程序中关闭主程序,你可以在启动升级程序的时候把自己的进程id传给它,在升级程序中就可以用TerminateProcess强行终止主程序
      

  3.   

    启动升级程序的时候把自己的进程id传给它,在升级程序中就可以用TerminateProcess强行终止主程序
    这个有示例吗
      

  4.   

    HWND hwnd = ::FindWindow(NULL,"程序");   这个句柄是否为空
      

  5.   

    如果要关闭自己,就写个exit(1);
    如果要关闭别人,就拿到那个进程的id ,然后发送一个消息,哪个进程接收到消息后 ,exit(1);你看看,多好。当然,postmessage(quit);也可以,但是要明确把消息传递给哪个进程id。
      

  6.   


    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");
      

  7.   


    如果是关闭自己 exit(0);吧
      

  8.   

    暴力点就是直接杀对方进程。如下面暴力关闭Excel.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;

      

  9.   

    LZ先尝试发关闭消息,如果不行,就强杀了。。我也在做一个升级程序,
    BOOL  CXXX::LookUpProcessAndKill(const  vector<CString>  &vecProcessName)
    {
    BOOL bRet = FALSE;
    HANDLE SnapShot, ProcessHandle;  
    SHFILEINFO shSmall;  
    PROCESSENTRY32 ProcessInfo;   SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
    if(SnapShot != NULL)   
    {  
    ProcessInfo.dwSize = sizeof(ProcessInfo);  // 设置ProcessInfo的大小  
    BOOL Status = Process32First(SnapShot, &ProcessInfo);  
    while(Status)  
    {  
    // 获取进程文件信息  
    SHGetFileInfo(ProcessInfo.szExeFile, 0, &shSmall, sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON);   //  检测进程是否需要关闭  
    _wcslwr(ProcessInfo.szExeFile);
    for (vector<CString>::size_type it = 0; it != vecProcessName.size(); ++ it)
    {
    if(!_wcsicmp(_wcslwr((wchar_t *)vecProcessName[it].GetString()), ProcessInfo.szExeFile))   
    {  
    // 获取进程句柄,强行关闭  
    ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID);  
    bRet = TerminateProcess(ProcessHandle, 1);  
    break;  
    }  
    }

    // 获取下一个进程的信息  
    Status = Process32Next(SnapShot, &ProcessInfo);  
    }  
    }
    return  bRet;
    }