我在程序中调用另一个程序.在windows中的运行窗口中敲入命令有效.
我在程序中用winexec却遇到了错误.原因是我在被调用的程序中建立了一个文件.
我想用createprocess却不会用(返回的错误代码说是内存分配错误).
那位能说明为什么吗.
或提供一个createprocess的运用代码.

解决方案 »

  1.   

    STARTUPINFO si;
    PROCESS_INFORMATION piProcess;
    ZeroMemory(&si,sizeof(si));
    si.cb=sizeof(si);
    CreateProcess(NULL,"c:\\windows\\notepad.exe",NULL,NULL,TRUE,0,
           NULL,NULL,&si,&piProcess);
      

  2.   

    CreateProcess(NULL, "\"C:\\Program Files\\MyApp.exe\" -L -S", ...)BOOL CreateProcess(
      LPCTSTR lpApplicationName,
      LPTSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCTSTR lpCurrentDirectory,
      LPSTARTUPINFO lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation
    );
      

  3.   


    “一个进程是一个正在执行的应用程序,它包含有:私有的虚拟地址空间、代码、数据和其它的操作系统资源,譬如进程可以存取的管道、文件和同步对象等等。”
    从上面的定义中您可以看到,一个进程拥有几个对象:地址空间、执行模块和其它该执行程序打开或创建的任何对象或资源。至少,一个进程必须包含可执行模块、私有的地址空间和一个以上的线程。什么是线程呢?一个线程实际上是一个执行单元。当WINDOWS产生一个进程时,它自动为该进程产生一个主线程。该线程通常从模块的第一条指令处开始执行。如果进程需要更多的线程,它可以随后显式地产生。
    当WINDWOS 接收到产生进程的消息时,它会为进程生成私有内存地址空间,接着把可执行文件映射到该空间。在WIN32下为进程产生了主进程后,您还可以调用函数CreateProcess来为您的进程产生更多的线程。CreateProcess的原型如下:CreateProcess proto lpApplicationName:DWORD,\ 
                                     lpCommandLine:DWORD,\
                                     lpProcessAttributes:DWORD,\ 
                                     lpThreadAttributes:DWORD,\ 
                                     bInheritHandles:DWORD,\ 
                                     dwCreationFlags:DWORD,\ 
                                     lpEnvironment:DWORD,\ 
                                     lpCurrentDirectory:DWORD,\ 
                                     lpStartupInfo:DWORD,\ 
                                     lpProcessInformation:DWORD 不要被这么多的参数吓倒,其实您可以忽略其中的大多数的参数(让它们有缺省值)。 lpApplicationName --> 可执行文件的名称(含或不含路径)。如果该参数为NULL,那必须在参数lpCommandLine中传递文件名称。
    lpCommandLine --> 传递给欲执行的文件的命令行参数。如果lpApplicationName为NULL,那必须在该参数中指定,譬如:"notepad.exe readme.txt" 。
    lpProcessAttributes 和 lpthreadAttributes --> 指定进程和主线程的安全属性。您可以把它们都设成为NULL,这样就设置了缺省的安全属性。
    bInheritHandles --> 标志位。用来设置新进程是否继承创建进程所有的打开句柄。
    dwCreationFlags --> 有几个标志可以在此处设置以决定欲创建进程的行为,譬如:您可能想创建进程后并不想让它立刻运行,这样在它真正运行前可以作一些检查和修改工作。您还可以在此处设置新进程中的所有线程的优先级,通常我们把它设置为NORMAL_PRIORITY_CLASS。
    lpEnvironment --> 指向环境块的指针,一般地环境块包含几个环境字符串。如果该参数为NULL,那么新进程继承创建进程的环境块。
    lpCurrentDirectory --> 指向当前目录以及为子进程设置的“当前目录”的路径。如果为NULL, 则继承创建进程的“当前目录”路径。
    lpStartupInfo --> 指向新进程的启动结构体STARTUPINFO的指针。STARTUPINFO告诉WINDOWS如何显示新进程的外观。该参数有许多的成员变量,如果您不想新进程有什么的特别之处,可以调用GetStartupInfo函数来用创建进程的启动参数来填充STARTUPINFO结构体变量。
    lpProcessInformation --> 指向结构体PROCESS_INFORMATION的指针,该结构体变量包含了一些标识该进程唯一性的一些成员变量: PROCESS_INFORMATION STRUCT 
        hProcess          HANDLE ?             ; handle to the child process 
        hThread            HANDLE ?             ; handle to the primary thread of the child process 
        dwProcessId     DWORD ?             ; ID of the child process 
        dwThreadId      DWORD ?            ; ID of the primary thread of the child process 
    PROCESS_INFORMATION ENDS
    进程句柄和进程ID是两个不同的概念。进程ID好似一个唯一值,而进程句柄是调用相关的WINDOWS API 后得到的一个返回值。不能用进程句柄来标识一个进程的唯一性,因为这个值并不唯一。在调用CreateProcess产生新进程后,该进程就被创建,而且CerateProcess函数立即返回。
      

  4.   

    注意
    STARTUPINFO si;
    PROCESS_INFORMATION piProcess;
    不能为局部变量
      

  5.   

    demetry(智者橡木) 说的我到没注意过。谢谢
      

  6.   

    别人说的很多了,我想不用CreateProcess也可以的,我用Shell也没有问题的。
    SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = "文件路径";
    ShExecInfo.lpParameters = “命令行参数";
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOW;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    应该可以和CreateProcess实现同样的效果的。
      

  7.   

    不会吧,给你个最简单的C运行库函数system(const char * command)
    需要include<process.h>
      

  8.   

    要是可以用RUN-TIME的话,那还有_exec,_spawn,功能更强
      

  9.   

    深入浅出ShellExecute 
    译者:徐景周(原作:Nishant S)Q: 如何打开一个应用程序? ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
    或 ShellExecute(this->m_hWnd,"open","notepad.exe",
        "c:\\MyLog.log","",SW_SHOW );
    正如您所看到的,我并没有传递程序的完整路径。
    Q: 如何打开一个同系统程序相关连的文档? ShellExecute(this->m_hWnd,"open",
        "c:\\abc.txt","","",SW_SHOW );
    Q: 如何打开一个网页? ShellExecute(this->m_hWnd,"open",
        "http://www.google.com","","", SW_SHOW );
    Q: 如何激活相关程序,发送EMAIL? ShellExecute(this->m_hWnd,"open",
        "mailto:[email protected]","","", SW_SHOW );
    Q: 如何用系统打印机打印文档? ShellExecute(this->m_hWnd,"print",
        "c:\\abc.txt","","", SW_HIDE);
    Q: 如何用系统查找功能来查找指定文件? ShellExecute(m_hWnd,"find","d:\\nish",
        NULL,NULL,SW_SHOW);
    Q: 如何启动一个程序,直到它运行结束? SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = "c:\\MyProgram.exe";
    ShExecInfo.lpParameters = "";
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOW;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
    或: PROCESS_INFORMATION ProcessInfo; 
    STARTUPINFO StartupInfo; //This is an [in] parameter
    ZeroMemory(&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
    if(CreateProcess("c:\\winnt\\notepad.exe", NULL, 
        NULL,NULL,FALSE,0,NULL,
        NULL,&StartupInfo,&ProcessInfo))

        WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
    }  
    else
    {
        MessageBox("The process could not be started...");
    }Q: 如何显示文件或文件夹的属性? SHELLEXECUTEINFO ShExecInfo ={0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = "properties";
    ShExecInfo.lpFile = "c:\\"; //can be a file as well
    ShExecInfo.lpParameters = ""; 
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOW;
    ShExecInfo.hInstApp = NULL; 
    ShellExecuteEx(&ShExecInfo);转载:
    http://www.vckbase.com/document/viewdoc.asp?id=416希望有所帮助:)