5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高手请看:如何得到用ShellExecuteEx()运行的程序的窗口句柄?

楼主iwaitting(爱晚亭)2002-06-11 21:34:10 在 VC/MFC / 基础类 提问

我的问题来自于这样一个应用:  
  我要在程序中打开各种格式的文件,如打开.ppt、.pdf、.txt、.doc等等,但程序并不知道用什么应用程序打开,所以只能用ShellExecuteEx()这个SHELL函数,但这个函数却不能得到打开.pdf等文件格式的应用程序的进、线程ID,所以不能控制该应用程序。怎么办? 问题点数:0、回复次数:10Top

1 楼Delver(老农)回复于 2002-06-11 21:40:49 得分 0

SHELLEXECUTEINFO的成员hProcess就是新创建的进程的句柄Top

2 楼Delver(老农)回复于 2002-06-11 21:42:21 得分 0

SHELLEXECUTEINFO的成员hProcess就是新创建进程的句柄Top

3 楼iwaitting(爱晚亭)回复于 2002-06-11 22:22:29 得分 0

不行,你可以试一试,返回的hProcess是0x00000000Top

4 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-06-11 23:13:27 得分 0

/*   Compile   options   needed:   none  
  */    
   
  #include   <windows.h>  
  #include   <stdio.h>  
   
  void   main(void)  
  {  
        PROCESS_INFORMATION   pInfo;  
        STARTUPINFO                   sInfo;  
        DWORD                               exitCode;  
   
        sInfo.cb                             =   sizeof(STARTUPINFO);  
        sInfo.lpReserved             =   NULL;  
        sInfo.lpReserved2           =   NULL;  
        sInfo.cbReserved2           =   0;  
        sInfo.lpDesktop               =   NULL;  
        sInfo.lpTitle                   =   NULL;  
        sInfo.dwFlags                   =   0;  
        sInfo.dwX                           =   0;  
        sInfo.dwY                           =   0;  
        sInfo.dwFillAttribute   =   0;  
        sInfo.wShowWindow           =   SW_SHOW;  
   
        if   (!CreateProcess(NULL,  
                                  "command.com   /c   dir   c:\\*.bat",  
                                              NULL,  
                                              NULL,  
                                              FALSE,  
                                              0,  
                                              NULL,  
                                              NULL,  
                                              &sInfo,  
                                              &pInfo))   {  
              printf("ERROR:   Cannot   launch   child   process\n");  
              exit(1);  
        }  
   
        //   Give   the   process   time   to   execute   and   finish  
        WaitForSingleObject(pInfo.hProcess,   5000L);  
   
        if   (GetExitCodeProcess(pInfo.hProcess,   &exitCode))  
        {  
              switch(exitCode)  
              {  
                    case   STILL_ACTIVE:   printf("Process   is   still   active\n");  
                                                          break;  
                    default:                       printf("Exit   code   =   %d\n",   exitCode);  
                                                          break;  
              }  
        }  
        else   {  
              printf("GetExitCodeProcess()   failed\n");  
        }  
  }Top

5 楼deadhorse(死马)回复于 2002-06-11 23:25:05 得分 0

对拉,不要shellexecute,用createprocess比较好Top

6 楼spidertan(灭蚊刀)回复于 2002-06-12 03:09:56 得分 0

很好!Top

7 楼iwaitting(爱晚亭)回复于 2002-06-12 13:00:28 得分 0

好什么呀,请注意我要打开的不是.exe、.com等可执行文件,而是如.txt、.doc、.pdf等数据文件(使用与之关联的程序)  
   
  现在我想到可以访问注册表得到文件的关联程序再打开。Top

8 楼polarisxu(北极星)回复于 2003-02-10 16:37:44 得分 0

SHELLEXECUTEINFO   ShExecInfo   =   {0};  
  要用下面的设置  
  ShExecInfo.fMask   =   SEE_MASK_NOCLOSEPROCESS;  
  bRet   =   ShellExecuteEx(&ShExecInfo);  
   
  则hProcess不会是零。  
  Top

9 楼wbj_song(小郎)回复于 2003-02-12 11:20:18 得分 0

ZeroMemory(&NameServersei,   sizeof(NameServersei));  
  NameServersei.cbSize   =   sizeof(NameServersei);  
  NameServersei.fMask   =   SEE_MASK_NOCLOSEPROCESS;  
  NameServersei.hwnd   =   NULL;  
  NameServersei.lpVerb   =   NULL;  
  NameServersei.lpFile   =   "文件名";//"1.ppt"  
  NameServersei.lpParameters   ="文件运行参数.没有就为空";  
  NameServersei.lpDirectory   ="文件目录";//   "C:\Bin";  
  NameServersei.nShow   =   SW_HIDE;  
  NameServersei.hInstApp   =   NULL;  
  ShellExecuteEx(&NameServersei);  
   
  //*************************************************  
                    TerminateProcess(NameServersei.hProcess,   0);//放在想结束线程的地方  
   
   
   
   
  Top

10 楼wbj_song(小郎)回复于 2003-02-12 11:21:05 得分 0

对了,要定义//  
  SHELLEXECUTEINFO   NameServersei;Top

相关问题

  • 谁会用ShellExecuteEx啊?我想取运行程序的句柄
  • 怎么获得一个正在运行的程序的句柄?
  • 如何得到用SHELL运行起来程序的句柄
  • 一个单文档程序,如何获得程序运行窗口的句柄
  • :~~~~~~~~~~请问 怎么取得运行中的应用程序的句柄?~~~~~~~~~~
  • 请问如何取得一个正在运行程序的句柄?
  • 程序运行两小时后OnCtlColor的pDC参数句柄m_hDC变为NULL?
  • 如何获取正在运行的其他程序的窗口句柄
  • 为什么label组件在程序运行时,用winsight测不到它的窗口句柄,是不是该组件根本没有句柄?
  • 为何有实例句柄这个概念?一个程序运行了多次用窗口句柄区分它们不就行了?

关键词

  • 应用程序
  • 文件
  • null
  • nameserversei
  • sinfo
  • 句柄
  • shellexecuteex
  • hprocess
  • shellexecuteinfo
  • exitcode

得分解答快速导航

  • 帖主:iwaitting

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问