分享

进程的创建

 lhzstudio 2011-10-24
Windows 环境下,进程就是一个正在运行的程序实例.线程是进程内执行代码的独立实体.创建一个进程后,系统会为该进程创建一个主线程.
通常通过调用 CreateProcess 函数创建进程,该函数原形如下:
 
BOOL CreateProcess(
LPCSTR lpApplicationName, 
//可执行文件的名称
LPSTR lpCommandLine, 
//指定了要传递给执行模块的参数
NULL,
//进程安全性,设为 NULL 表示使用默认安全属性LPSECURITY_ATTRIBUTES lpProcessAttributes,
//线程安全性,设为 NULL 表示使用默认安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes
//指定当前进程的可继承句柄是否可以被新进程继承
BOOL bInheritHandle,
//指定了新进程的优先级和其它创建标志
DWORD dwCreationFlags,
LPVOID lpEnvironment,
//指定了新进程使用的环境变量
LPCSTR lpCurrenDirectory,
//新进程使用的目录
LPSTARUPINFO lpStartupinfo, 
//指定新进程的显示信息
//返回新建进程的标志信息,ID ,句柄等
LPPROCESS_INFORMATION lpProcessInformation
)
 
上面的参数的数据类型是 Windows 自定义的数据类型,具体定义在 WINDEF.h文件中,下面列出一部分常用的数据类型
typedef unsigned long   DWORD;
typedef int           BOOL;
typedef unsigned char   BYTE;
typedef unsigned short WORD
typedef float          FLOAT;
typedef void far      *LPVOID;
typedef int           INT;
typedef unsigned int    UINT;
 
lpProcessInformation 参数是一个指向 PROCESS_INFORMATION 结构的指针,CreateProcess 函数返回之前会初始化这些结构成员,结构定义如下:
typedef struct
{
       HANDLE hProcess;   //新建进程的内核句柄
       HANDLE hThread;   //新建进程中主线程的内核句柄
       DWORD dwProcessId;   //新建进程的ID
       DOWRD dwThreaId;    //新建进程的主线程ID
}
 
 
创建进程以后,必须调用 CloseHandle 函数关闭所创建的进程内核对象和线程内核对象,否则进程虽然终止了,但是该进程占用的资源依然没有释放
 
完整示例代码如下(该程序运行的时候会自动打开系统自带的记事本程序):
 
#include <windows.h>
 
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    char *szCommandLine = "notepad.exe";
    STARTUPINFO si = {sizeof(si)}; //初始化STARTUPINFO 结构的大小
    PROCESS_INFORMATION pi; //该变量保存新建进程的标志信息
    BOOL bRet = ::CreateProcess(NULL, //不在此指定可执行的文件名
                                szCommandLine, //命令行参数
                                NULL, //默认进程安全属性
                                NULL, //默认线程安全属性
                                FALSE, //指定当前进程内的句柄不可以被新进程继承
                                NULL,   //使用默认的创建方式
                                NULL,   //使用本进程的环境变量
                                NULL,   //使用本进程的目录
                                &si,    //使用默认的显示方式
                                &pi); //保存新建进程的标志信息
    if(bRet)
    {
        //关闭新建进程和主线程的句柄
        ::CloseHandle(pi.hProcess);
        ::CloseHandle(pi.hThread);
    }
    return 0;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多