Logo Background RSS

Windows 创建进程 — 详解API函数CreateProcess()

  • 本文由 SUNJIANSUNJIAN 于 2008年十一月9日 发表在 《Windows OS
    交流信息: 哇!现在有 9 位大侠指点过了.9 条评论 Comments (660 views)

    【关于操作系统进程和线程的编程实例】在windows NT 环境 下创建进程的和子进程的方法可以调用windows 的 API 函数 CreateProcess . 实际上即是 在一个 CreateProcessTest.exe 的程序中使用了 CreateProcess() 函数调用了另外一个可执行模块,而这个可执行模块即是CreateProcessTest.exe 的子进程 。 用很简单明了的话来说就是 在一个 可执行文件中调用了 另外一个可执行文件作为子进程(初步理解,有待深入,望高人能指点指点)。通过在下下面的细细到来,您如果未曾涉猎这个领域的话,应该能很快的学会如何在windows中创建进程,以及线程句柄的控制。以及获取进程和线程的相关信息。Thx.
    下面首先来具体说一下这个API 函数:

    1. //<strong> Windows CreateProcess 函数原型 </strong>
    2.     ***********************************
    3. BOOL WINAPI CreateProcess(
    4.   __in          LPCTSTR lpApplicationName,                 
    5. [指定可执行模块的字符串]
    6.   __in_out      LPTSTR lpCommandLine,                      
    7. [从命令行读入执行模块]
    8.   __in          LPSECURITY_ATTRIBUTES lpProcessAttributes
    9. [决定所返回的句柄是否可以被子进程继承]
    10.   __in          LPSECURITY_ATTRIBUTES lpThreadAttributes
    11. [决定所返回的句柄是否可以被子线程继承]
    12.   __in          BOOL bInheritHandles,                      
    13. [如果这个参数为TRUE,这所有句柄会被子进程继承]
    14.   __in          DWORD dwCreationFlags,                     
    15. [控制优先级和创建过程]
    16.   __in          LPVOID lpEnvironment,                      
    17. [指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。]
    18.   __in          LPCTSTR lpCurrentDirectory,                
    19. [子进程的工作路径]
    20.   __in          LPSTARTUPINFO lpStartupInfo,               
    21. [决定新进程的主窗体如何显示]
    22.   __out         LPPROCESS_INFORMATION lpProcessInformation 
    23. [接收新进程的识别信息]
    24. );
    25.     ************************************

    //适用平台:
    Client :Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
    Server :Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.
    //需求 :
    Header : Declared in Winbase.h; include Windows.h.

    Library : Use Kernel32.lib.

    DLL : Requires Kernel32.dll.

    Unicode : Implemented as CreateProcessW (Unicode) and CreateProcessA (ANSI).

    在调用该函数的时候可以传入两种可执行模块,一个是直接在函数参数中传递,通过LPCTSTR lpApplicationName,参数 。另一种是通过MS-DOS命令行,通过LPTSTR lpCommandLine, 实现 。
    在接下来的实例中是这样的:
    if( !CreateProcess( NULL,
    argv[1], //在这里读入控制台参数,创建进程
    …..) ; //为了简洁,只写了第一二个参数 。
    接下来是源码,注释还算详细,细细看看,应该就明白了:

    1. // created by daniel sun @ 2008.11.09 wellcome to my homepage www.Allove.org
    2. #include "stdafx.h"
    3. #include <windows .h>
    4. #include <stdio .h>
    5. #include <tchar .h>
    6. #include <iostream>
    7.  
    8. void _tmain( int argc, TCHAR *argv[] )
    9. {
    10.     STARTUPINFO si//Specifies the window station,
    11.                      //desktop, standard handles, and appearance of
    12.                      //the main window for a process at creation time.
    13.  
    14.     PROCESS_INFORMATION pi; //进程信息,原始结构体如下:
    15.     /*
    16.     typedef struct _PROCESS_INFORMATION
    17.     {  HANDLE hProcess; 
    18.     HANDLE hThread; 
    19.     DWORD dwProcessId; 
    20.     DWORD dwThreadId;
    21.     } PROCESS_INFORMATION,  *LPPROCESS_INFORMATION;
    22.     */
    23.    
    24.     //Fills a block of memory with zeros. 初始化内存块,全部填充值
    25.     ZeroMemory( &si, sizeof(si) );
    26.     si.cb = sizeof(si);
    27.     ZeroMemory( &pi, sizeof(pi) );
    28.  
    29.     if( argc != 2 ) //控制台读入两个字符串,一个是本程序的名字,另一个是要建立子的进程
    30.     {
    31.         printf("用法: %s [cmdline]\n", argv[0]); //提示用户如何传入参数
    32.         printf("运行方式不正确!系统退出..\n"); //用于测试
    33.         system("pause"); //用于测试
    34.         return;
    35.     }
    36.  
    37.     // 创建子进程
    38.     if( !CreateProcess( NULL,   // No module name (use command line)
    39.         argv[1],        // Command line  //TEXT("D:\\MyDocuments\\Visual Studio 2005\\project\\Stack_TCC\\debug\\Stack_TCC.exe"),
    40.         NULL,           // Process handle not inheritable
    41.         NULL,           // Thread handle not inheritable
    42.         FALSE,          // Set handle inheritance to FALSE
    43.         0,              // No creation flags
    44.         NULL,           // Use parent's environment block
    45.         NULL,           // Use parent's starting directory
    46.         &si,            // Pointer to STARTUPINFO structure
    47.         &pi )           // Pointer to PROCESS_INFORMATION structure
    48.     ) 
    49.     {
    50.         printf("创建进程失败(%d)\n", GetLastError() );
    51.         //printf("创建进程失败..");
    52.         system("pause"); //用于测试
    53.         return;
    54.     }
    55.  
    56.     //打印进程信息
    57.     printf("一下是子进程的信息:\n");
    58.     printf("进程ID pi.dwProcessID: %d \n",pi.dwProcessId);
    59.     printf("线程ID pi.dwThreadId: %d \n",pi.dwThreadId);
    60.     //printf("句柄进程pi.hProcess: %s \n",pi.hProcess);
    61.     //printf("句柄线程pi.hThread: %s \n",pi.hThread);
    62.     // 等待知道子进程退出...
    63.     WaitForSingleObject( pi.hProcess, INFINITE );
    64.     //WaitForSingleObject()函数检查对象的状态,如果是未确定的则等待至超时
    65.     /*
    66.         //WaitForSingleObject()函数原型:
    67.          DWORD WINAPI WaitForSingleObject(
    68.                 __in          HANDLE hHandle,
    69.                 __in          DWORD dwMilliseconds  //超时时限 INFINITE 为无穷
    70.                 );
    71.     */
    72.  
    73.     //子进程退出
    74.     printf("子进程已经退出... \n");
    75.  
    76.  
    77.     //关闭进程和句柄
    78.     CloseHandle( pi.hProcess );
    79.     CloseHandle( pi.hThread );
    80.     system("pause");
    81.     exit(0);
    82.  
    83. }
    84. </iostream></tchar></stdio></windows>

    编译上面这段代码应该能得到一个二进制文件,假设你将它命名为 :CreateProcessTest.exe
    使用方法是这样的:
    在命令行中执行 CreateProcessTest.exe yourProgramName.exe
    【程序运行之后可以在任务管理器里面查看进程】
    【为了不引起不必要的麻烦建议yourProgramName.exe使用一个win32控制台程序(你可以简单的写一个HelloWord.exe来测试),这里所谓的不必要的麻烦是程序中传的参数决定的,今天暂时不讲】

    就到这里吧!小结一下子 : 详细介绍了windows API 函数 CreateProcess() 各个参数及其意义与用法,通过一个实例来阐释了如何在windows系统中创建进程,和获取进程信息,以及相关的句柄。下面呢?没了。

  • 我们的说明!

    欢迎转载,但请您以链接形式注明本文出处和本站原文链接,下面是链接形式,谢谢合作!
    出处链接:Allove of Paradise
    原文链接:http://blog.allove.org/archives/windows-api-createprocess.html
9 条评论
  1. #1 JoBru
    十一月 9th, 2008 at 12:51 下午

    related这块挺酷的~~
    PS:貌似没有上下篇的链接~

    [回复]

    Daniel Reply:

    呵呵,我还没注意 现在有了,还有什么细节的地方一定告诉我哟。Thx

    [回复]

    Post ReplyPost Reply
  2. #2 sanding
    十一月 9th, 2008 at 4:39 下午

    学习了~

    [回复]

    Post ReplyPost Reply
  3. #3 ZH CEXO
    十一月 9th, 2008 at 6:01 下午

    这个太高深了,我不懂……

    [回复]

    Post ReplyPost Reply
  4. #4 周公解梦
    十一月 9th, 2008 at 8:35 下午

    嘿嘿,貌似以前用过一点,好久不用了,现在都忘记了,,,,,

    [回复]

    Post ReplyPost Reply
  5. #5 子曰
    十一月 9th, 2008 at 8:36 下午

    子曰:很深奥啊

    [回复]

    Post ReplyPost Reply
  6. #6 醉倚西风
    十一月 10th, 2008 at 8:46 上午

    主题太赞了 丫丫

    [回复]

    Post ReplyPost Reply
  7. #7 JoBru
    十一月 10th, 2008 at 9:53 下午

    厄,好像都挺好了吧,除了一些细节的配色
    PS:顶部的分类会不会占用太大了,一行三四个?

    [回复]

    Post ReplyPost Reply
  8. #8 Yacca
    十一月 11th, 2008 at 11:19 上午

    这个我就不关注了

    皮是很好看 但总觉得细节哪里还抠的不够…继续精进吧…

    [回复]

    Post ReplyPost Reply
Leave a Comment

ALLOVE短信