我将该源码中的#define MY_EXECUTE_NAME "SvcHostDLL.exe"
改为记事本
#define MY_EXECUTE_NAME "notepad.exe"服务启动时确实运行了notepad.exe,但不能显示其窗口,后来得知,服务程序和一般的应用程序不在同一个窗口环境,所以服务程序创建的程序是看不到窗口的。
如果我想将notepad的窗口显示出来,听说用CreateProcessAsUser()函数代替CreateProcess可以实现,但试了很久,不成功,各位帮手:    STARTUPINFO si = {0};
    PROCESS_INFORMATION pi;
    si.cb = sizeof si;
    if(bInteract) si.lpDesktop = "WinSta0\\Default"; 
    if(!CreateProcess(NULL, cmd, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
        OutputString("SvcHostDLL: CreateProcess(%s) error:%d", cmd, GetLastError());
    else OutputString("SvcHostDLL: CreateProcess(%s) to %d", cmd, pi.dwProcessId); 

解决方案 »

  1.   

    这样就可以了啊:
    int RealService(char *cmd, int bInteract)
    {
        OutputString("LLYFSpySvc: RealService called '%s' %s", cmd, bInteract ? "Interact" : "");
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi;
        si.cb = sizeof si;
        if(bInteract) si.lpDesktop = "WinSta0\\Default"; 
        if(!CreateProcess(NULL,
                          cmd,
                          NULL,
                          NULL,
                          false,
                          0,
                          NULL,
                          NULL,
                          &si,
                          &pi))
            OutputString("LLYFSpySvc: CreateProcess(%s) error:%d", cmd, GetLastError());
        else OutputString("LLYFSpySvc: CreateProcess(%s) to %d", cmd, pi.dwProcessId);    return 0;
    }
      

  2.   

    哦,忘了一个事,你要指定后面的参数bInteract
    那篇文章里的例子这样的命令行启动sc start iprip "cmd /k whoami" 1
    后面就是指定了1为参数,才会执行if(bInteract) si.lpDesktop = "WinSta0\\Default"; 这个