我想在通过写一个服务来,启动应用程序,在服务程序里用ShellExecute(),好像不行,不知道什么原因!!

解决方案 »

  1.   

    因为一般服务没有打开桌面交互选项,也就是在system帐号下运行。可以通过服务管理器修改,也可以修改服务的运行权限。
      

  2.   

    ShellExecute(NULL,"open",achAppPath,NULL,NULL,SW_SHOWNORMAL)这个这样写有问题么?
    第一个参数我设置为空!
      

  3.   

    因为你服务启动的UI程序无法在当前桌面显示
    你可以获得当前用户explorer.exe的token,然后以CreateProcessAsUser模拟当前用户启动你的程序,这样可以显示出来
      

  4.   

    你服务启动的程序不能在当前桌面显示,可以先得到当前用户explorer.exe的token,然后在服务中用CreateProcessAsUser模拟当前用户启动程序..
      

  5.   

    启动服务的时候报XX内存不可读,找了半天还是不清楚,框架是用别人的
    源码如下// FileProSer.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "windows.h"
    #include "stdio.h"#define LOGFile "c:\\log.txt"SERVICE_STATUS  ServiceStatus; 
    SERVICE_STATUS_HANDLE hStatus;void ServiceMain();
    void ControlHandler(DWORD request);int InitService();int WriteToLog(char* str)
    {
    FILE* log = fopen(LOGFile,"a+"); if(log == NULL)
    return -1;
    fprintf(log,"%s\n",str);
    fclose(log);
    return 0;}
    int InitService()
    {
    OutputDebugString("START");
    int result;
    result = WriteToLog("START"); return result;
    }void ControlHandler(DWORD request)
    { switch(request)
    {
    case SERVICE_CONTROL_STOP:
    OutputDebugString("STOP");
    WriteToLog("....STOP");

    ServiceStatus.dwWin32ExitCode = 0;
    ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hStatus,&ServiceStatus);
    return;
    case SERVICE_CONTROL_SHUTDOWN:
    OutputDebugString("STOP");
    WriteToLog("....STOP"); ServiceStatus.dwWin32ExitCode = 0;
    ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hStatus,&ServiceStatus);
    return; default:
    break; }
    SetServiceStatus(hStatus,&ServiceStatus); return;}void ServiceMain()//int argc,char** argv
    {
    int error;
    ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler("RunFilePro",(LPHANDLER_FUNCTION)ControlHandler); if(hStatus == (SERVICE_STATUS_HANDLE)0)
    {
    return ;
    } error = InitService(); if(error)
    {
    ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus,&ServiceStatus);
    }
    if(ServiceStatus.dwCurrentState = SERVICE_RUNNING)
    {
    char achAppPath[MAX_PATH]={0};
    char *pchPath=NULL;
    GetModuleFileName(NULL,achAppPath,MAX_PATH);
    pchPath = strrchr(achAppPath, '\\') + 1;

    if (pchPath != NULL)
    *pchPath = 0;  strcat(achAppPath,"XDict.exe"); ShellExecute(NULL,"open","D:\\工具软件\\金山词霸\\XDict.exe",NULL,NULL,SW_SHOWNORMAL);//achAppPath
    }}void main()
    { SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "RunFilePro";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable);}
      

  6.   

    创建进程??我想通过服务将应用程序启动!!我用的是xp sp2
      

  7.   

    大体上是解决了,和桌面交互通过安装服务的时候通过
    CreateService( 
            schSCManager,  
            SVCNAME,
            SVCNAME,
            SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,//SERVICE_INTERACTIVE_PROCESS设置这样服务属性就将和桌面交互勾上,然//后试下上面说的方法
            SERVICE_AUTO_START, 
            SERVICE_ERROR_NORMAL,
            szPath,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);
      

  8.   

    请问这个和上面的怎么联系起来?可以给我发个源码吗?谢谢:[email protected]