+ -
当前位置:首页 → 问答吧 → createprocess 总是提示找不到指定文件

createprocess 总是提示找不到指定文件

时间:2011-12-14

来源:互联网

我用createprocess 开启一个python进程。
C/C++ code

       STARTUPINFO si;
        memset(&si, 0, sizeof(STARTUPINFO));
        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_SHOW;
        PROCESS_INFORMATION pi; //必备参数设置结束
        if(!CreateProcess(_T("C:\\Python27\\python.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
        {
                DWORD nErrorNo = GetLastError ( );
                LPTSTR lpBuffer; 
                FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER  | 
                        FORMAT_MESSAGE_IGNORE_INSERTS  |
                        FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL,
                        nErrorNo,
                        LANG_NEUTRAL,
                        (LPTSTR) & lpBuffer,
                        0 ,
                        NULL );
                //CString strErrorCause  =  lpBuffer  ?  _T(lpBuffer):_T( " Sorry, cannot find this error info. " );
                AfxMessageBox(lpBuffer);
                LocalFree (lpBuffer);
                //AfxMessageBox(strErrorCause);
                return;
        }
        else
        {
                AfxMessageBox(_T("OK"));
        }



如果第一个参数用完整路径就能够打开,如果只写python.exe就打不开。
但是我的python.exe已经加到path环境变量中了,在命令行下敲入“python”就可以打开啊。
每台机子装python的路径不会一样,请问如何让CreateProcess能够直接用“python”来启动

作者: ydnh_wan   发布时间: 2011-12-14

CreateProcess(NULL,"python.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
//注意这两个参数的差别

作者: agoago_2009   发布时间: 2011-12-14

1.lpApplicationName:   指向一个NULL结尾的、用来指定可执行模块的字符串。   这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。   这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。   这个被指定的模块可以是一个Win32应用程序。如果适当的子系统在当前计算机上可用的话,它也可以是其他类型的模块(如MS-DOS 或 OS/2)。   在Windows NT中,如果可执行模块是一个16位的应用程序,那么这个参数应该被设置为NULL并且应该在lpCommandLine参数中指定可执行模块的名称。16位的应用程序是以DOS虚拟机或Win32上的Windows(WOW) 为进程的方式运行。   2.lpCommandLine:   指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。   这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当作要运行的程序的命令行。   如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。   如果lpApplicationName参数为空,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。如果文件名以一个点(.)结尾且没有扩展名,或文件名中包含路径,.exe将不会被加到后面。如果文件名中不包含路径,Windows将按照如下顺序寻找这个可执行文件:   1).当前应用程序的目录。   2).父进程的目录。

作者: oyljerry   发布时间: 2011-12-14

1和2楼已经解释清楚了。。。

作者: sdl2005lyx   发布时间: 2011-12-14

12ok

作者: yayafu   发布时间: 2011-12-14