问了一个月了,没人会,关于createprocess,来者有分!我的代码如下,shan.exe在windows\system32目录下面
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szCommandLine[] = TEXT("shan");
CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);1, windows用户登陆后,如果在一个exe文件中button事件加入上面代码,可以运行起来shan.exe.
2, 假如在windows用户登陆前,会执行一个dll文件,而我把上面的代码放入这个dll中,我发现CreateProcess返回为真,但是shan.exe却运行不起来.请问这是为什么啊???

解决方案 »

  1.   

    小弟猜測:     HDESK   hdesk;
        HWINSTA hwinsta;
        hwinsta = OpenWindowStation("winsta0", FALSE,                          
                                      WINSTA_ACCESSCLIPBOARD   |
                                      WINSTA_ACCESSGLOBALATOMS |
                                      WINSTA_CREATEDESKTOP     |
                                      WINSTA_ENUMDESKTOPS      |
                                      WINSTA_ENUMERATE         |
                                      WINSTA_EXITWINDOWS       |
                                      WINSTA_READATTRIBUTES    |
                                      WINSTA_READSCREEN        |
                                      WINSTA_WRITEATTRIBUTES);
           hdesk = OpenDesktop("default", 0, FALSE,                
                                DESKTOP_CREATEMENU |
                                DESKTOP_CREATEWINDOW |
                                DESKTOP_ENUMERATE    |
                                DESKTOP_HOOKCONTROL  |
                                DESKTOP_JOURNALPLAYBACK |
                                DESKTOP_JOURNALRECORD |
                                DESKTOP_READOBJECTS |
                                DESKTOP_SWITCHDESKTOP |
                                DESKTOP_WRITEOBJECTS);
      STARTUPINFO si;        
     PROCESS_INFORMATION pi; 
     ZeroMemory ((PVOID)&si, sizeof(si)); si.cb = sizeof (si);
     si.lpDesktop = _T("default"); CreateProcess (NULL,   // image name
          "shan", // command line
          NULL,   // process security attributes
          NULL,   // thread security attributes
          TRUE,   // inherit handles
          CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,
          NULL,   // environment block
          NULL,   // current directory
          &sui,   // STARTUPINFO
          &pi);   // PROCESS_INFORMATION
    }
      

  2.   

    DWORD D=GetLastError(); CString s;
    s.Format("%d",D);
    MessageBox(s);
    请通过GetLastError() 看看出错原因
      

  3.   

    在登陆WINDOWS之前,有一些DLL系统还没加载,可能就是这样导致有些API无法使用,进而导致你的创建进程失败。所以你可以在程序中主动加载所需要的DLL。你也可以用kernellong 的方法来输出错误原因,然后根据错误代码找出错原因。
      

  4.   

    你先用任务管理器看看你的程序执行没?如果执行了就是superstition(小佶) 所说的。
      

  5.   

    那就是superstition(小佶)说的原因,你的进程已system执行了,但这个user的程序所在的窗口在不在winstat0,所以是显示不出来的,我们所看到的桌面已经窗口是在winstat0的default桌面下。
      

  6.   

    CSDN 世风日下了啊。。
    人气没有以前火了,牛人也不出现了~~
    偶也是一新手,无奈啊
      

  7.   

    我估计是程序路径的问题,你在createprocess函数里把路径写成了NULL,这样的话,它会在DLL所在路径找SHAN,而不是在SYSTEM里面找。
    WIDOWS用户登陆后,WINDOWS将加载路径,SYSTEM是一个默认路径,所以你在其他EXE中调用这个SHAN的时候,系统会自动在SYSTEM下找到SHAN,但是你在登陆前调用SHAN,系统可能还没有加载SYSTEM路径