SHELLEXECUTEINFO  ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = L"ClientNpc.exe";
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = L"E:\\公司\\All Tools\\ClientNpc\\Debug";                  
ShExecInfo.nShow = SW_NORMAL;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);//为什么得到的handle是空?怎么才能得到这个应用程序的HANDLE呢?
HANDLE handle = ShExecInfo.hProcess;
 
//如何通过这个handle来得到“ClientNpc.exe”的进程ID
//如果用GetWindowThreadProcessId(HWND hWnd,0);的话,第一个参数是HWND,可那个是HANDLE,如何转换呢?
// do sonmthing...//通过进程ID来关闭进程,为什么程序找不到TerminateProcessById();这个函数?这个函数是WIN API么?
//如果不行,有别的方法关闭应用程序么?除了用TerminateProcess强制关闭的方法!
//FindWindow + SendMessage(WM_CLOSE....)对我来说不能用,因为我需要启动很多窗口标题一样的应用程序。
// do sonmthing...

解决方案 »

  1.   

    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    查api的帮助就不要到处白了,直接看msdn就行了. 没有TerminateProcessById这个API
      

  2.   

    ls 的正解API直接去MSDN查就好了。
      

  3.   

    1、为什么得到的handle是空?怎么才能得到这个应用程序的HANDLE呢?
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  MSDN对其有详细说明
    2、如果你想得到进程ID的话,可以直接使用CreateProcess来创建进程便可以获取
    3、没有TerminateProcessById(),需要先OpenProcess获得句柄再使用TerminateProcess
      

  4.   

    如果想通过句柄获取进程ID,可以使用NtQuerySystemInformation枚举进程句柄进行比较。
      

  5.   

    可以说的再详细点么?
    其实我就是想用SHELLEXECUTEINFO来实现自动打开EXE,然后还需要过一段时间后自动关闭这个应用程序,所以想用关闭进程的方式做
    但不知道到底是用句柄还是用进程ID来关闭,到底用哪一个好,怎么用?
      

  6.   

    HANDLE handle = ShExecInfo.hProcess;//现在我得到了这个HANDLE,请问应该用什么安全合理的办法来关闭应用程序呢?不想强制关进程!
      

  7.   

    可以使用WM_CLOSE或者WM_QUIT消息,只适用于主线程有(已经有)消息队列的程序:
    PostThreadMessage(ThreadId/*主线程ID*/ ,WM_CLOSE, 0, 0);