在服务程序里面create了一个线程,用来执行IE!
可是在任务管理器里面看到IEXPLORE只是执行了一下,就被杀死了!
为什么不能完全执行,请各位老大指教!
VOID ShellSend(char* param)
{
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "iexplore";
ShExecInfo.lpParameters = param;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);

}DWORD WINAPI ServerThread(PVOID pParam)
{
int i=3;

while(i)
{
ShellSend("OK");
i--;
Sleep(100);
} return 0;
}

解决方案 »

  1.   

    有没有出错提示,ShellExecuteEx返回值是多少
      

  2.   

    The SEE_MASK_DDEWAIT flag must be specified if the thread calling ShellExecuteEx does not have a message loop or if the thread or process will terminate soon after ShellExecuteEx returns. 如果调用SHELLEXECUTEEX的线程没有消息循环, 必须指定SEE_MASK_DDEWAIT属性. 见MSDN 关于 SHELLEXECUTEINFO 的说明
      

  3.   

    总的说来这是一个比较有深度和难度的问题,因为这里至少涉及到以下几个方面:
    1. Windows Service程序
    2. Iexplore.exe应用程序
    3. Windows安全策略
    4. 父/子进程以及进程运行环境,包括workstation/desktop/global atom table…首先说Windows Service程序, Service程序是一种特殊的应用程序,和其他应用程序一样,它必须也要运行在一定的用户上下文环境中。由于Service程序可以在任何用户logon之前运行,所以缺省情况下Service程序运行在被称为”localsystem” 的用户上下文环境中。由于”localsystem”用户是本机权力最高的用户,所以Windows从安全策略考虑,限制了”localsystem”对网络的访问能力。由Service程序启动的子进程,一般要继承父进程的允许环境,所以在Service启动的Iexplore.exe应用程序也是在”localsystem”的用户上下文环境中。因此从理论上说Iexplore.exe应用程序的网络访问能力受到限制也是合情合理的。(这可以看作Iexplore.exe不能正常启动的理论基础!)另外缺省情况下Service程序不能和当前的logon用户交互(interactive), 即Service程序拥有自己专门的Desktop/workstation。但通过Service配置,可以允许Service程序和当前的logon用户交互,这样当前的logon用户可以看到Service程序中的窗口(如果Service程序有窗口) 。既然你可以看到”在任务管理器里面看到IEXPLORE只是执行了一下,就被杀死了”, 说明你的Service程序是可以交互的。下面让我们再稍微分析一下导致IEXPLORE在Service程序中没有正常启动的具体原因。(注:你的以上程序在普通程序中可以正常启动IEXPLORE!) 。通过使用API Tracer分析器跟踪IEXPLORE的启动过程并比较API调用结果 (一个是从普通程序中启动IEXPLORE,另一个是从Service程序中启动IEXPLORE),发现直接导致IEXPLORE启动失败的原因与IEXPLORE启动时调用GlobalAddAtomW() , GetEnvironmentString()函数有关。正如前面提到的,由于IEXPLORE启动时需要用到当前用户的global atom table和环境变量,但由于此时IEXPLORE运行的上下文环境是”localsystem” ,并不是当前logon用户的上下文环境,所以GlobalAddAtomW()失败!由此可以推断IEXPLORE只能在logon用户的上下文环境运行。即使IEXPLORE可以在”localsystem” 的上下文环境运行,由于Windows的安全策略,IEXPLORE也不可能正常运行。以上分析仅代表个人观点。如有错误,希望指正。
      

  4.   

    han012(阿毛) 你好!
    您提到在”localsystem” 的用户上下文环境中有可能IE执行不对,
    我在MSDN上面看到除了”localsystem” 还有USER ACCOUNT等账号,
    是不是这些设置成这种账号就可以解决这个问题?
    请问有没有解决办法?
    谢谢了
      

  5.   

    感谢大家的参与,问题已经解决! everandforever(Forever)说的对,
    我昨天这么改了以后没有效果,今天在运行程序就可以了,不知道为什么,我要搞疯了!也谢谢 han012(阿毛) ,我从你的帖子中还是学到了不少东西!