第二 02CreateProcess

// 王艳平 <windows程序设计> 学习笔记2
/*
内核对象:一个内核对象是一快内核分配的内存,它只能运行在内核模式下的代码访问。
内核对象记录的数据在整个系统中只有一份,所以也称为系统资源。
内核对象和普通的数据结构最大的区别是其内部的数据结构是隐藏的,必须调用一个对象服务(成员函数吗?)
才能从此对象中得到数据,或者是想其输入数据,而不能直接读或者改变对象内部的数据。
  引入内核对象以后,系统可以方便的完成下面4个任务:
  (1)为系统资源提供可识别的名字。
  (2)在进程之间共享资源和数据。
  (3)在保护资源不会被未经许可的代码访问
  (4)跟踪对象的引用情况。这使得系统知道什么时候一个对象不在被使用了,以便释放它的内存空间。
  //这4点是内核对象存在的必要性吧。
  对于内核对象脑袋里面是不是很清楚是个什么东东。
----------------------------------
  一般将创建进程的称为父进程,被创建自然叫子进程。系统在创建新的进程的时会为新的进程指定一个
  STARTUPINFO类型的变量,这个结构包含了父进程传给子进程的一些显示信息。STARTUPINFO的结构定义如下:
 
 The STARTUPINFO structure is used with the CreateProcess function to specify main window properties if a new window is created for the new process. For graphical user interface (GUI) processes, this information affects the first window created by the CreateWindow function and shown by the ShowWindow function. For console processes, this information affects the console window if a new console is created for the process. A process can use the GetStartupInfo function to retrieve the STARTUPINFO structure specified when the process was created.

 typedef struct _STARTUPINFO {
    DWORD   cb;            // 本结构的长度,总是应该被设为 sizeof(STARTUPINFO) 
    LPTSTR  lpReserved;    // 保留(reserve)字段 
    LPTSTR  lpDesktop;  // 指定桌面名称
    LPTSTR  lpTitle;        // 控制台应用程序使用,指定控制台程序的标题
    DWORD   dwX;   // 指定新创建窗口的位置坐标(dwX,dwY)和大小信息
    DWORD   dwY;   
    DWORD   dwXSize;
    DWORD   dwYSize;
    DWORD   dwXCountChars;   // 控制台程序使用,指定控制台的窗口的函数
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute;  // 控制台程序使用,指点控制台窗口的背景色
    DWORD   dwFlags;   // 它决定STARTUPINFO哪些成员有效
    WORD    wShowWindow; // 窗口的显示方式 
    WORD    cbReserved2;
    LPBYTE  lpReserved2;
    HANDLE  hStdInput;  // 控制台程序使用,几个标准的句柄
 HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFO, *LPSTARTUPINFO;

remarks:
  定义一个STARTUPINFO结构的对象以后,总要爱使用此对象之前将对象cb成员初始化为STARTUPINFO的大小:
  原因是windows兼容以前的版本所以......
  STARTUPINFO si={sizeof(si)}; // 将cb成员初始化为sizeof(si),其他的成员初始化为0。
several function about STARTUPINFO

VOID GetStartupInfo(LPSTARTUPINFO lpStartupinfo);
//取得当前进程的创建信息指定的STARTUPINFO结构。


关于CreateProcess function


This function is used to run a new program. It creates a new process and its primary thread. The new process executes the specified executable file.

A remote application interface (RAPI) version of this function exists, and it is named CeCreateProcess.

CreateProcess(
 LPCWSTR lpszImageName,     // 可执行文件的名称
 LPCWSTR lpszCmdLine,     // 指定了要传递给执行模块的参数
 LPSECURITY_ATTRIBUTES lpsaProcess,   // 进程的安全性,值为NULL的话 表示使用默认的安全属性
 LPSECURITY_ATTRIBUTES lpsaThread,   // 线程的安全性,值为NULL的话 表示使用默认的安全属性
 BOOL fInheritHandles,     // 指定当前进程中的可继承句柄是否可被新进程继承 
 DWORD fdwCreate,      // 指定了新的进程的优先级以及其他创建标志
 LPVOID lpvEnvironment,     // 指点新进程使用的环境变量
 LPWSTR lpszCurDir,      // 新进程使用的当前变量
 LPSTARTUPINFOW lpsiStartInfo,   // 指定新的进程主窗口的位置,大小和标准句柄
 LPPROCESS_INFORMATION lppiProcInfo); // [out]返回新建进程的标志信息,如ID号,句柄


lppiProcInfo 参数是一个指向PROCESS_INFORMATION 结构的指针。CreateProcess函数在返回之前会初始化此
结构的成员。结构定义如下:

PROCESS_INFORMATION
This structure is filled in by the CreateProcess function with information about a newly created process and its primary thread.

typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;

 

相关代码.

// 创建进程的例子
// 它打开了windows自带的命令行程序 cmd.exe
// 02CreateProcess
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
 char szCommandLine[]="notepad";
 STARTUPINFO si={sizeof(si)};
 PROCESS_INFORMATION pi;

 si.dwFlags=STARTF_USESHOWWINDOW; // 指定wshowwindow成员有效
 si.wShowWindow=TRUE;   // 此成员设为TRUE的话 则显示新建进程的住窗口

 BOOL bRet=::CreateProcess(
  NULL,   // 不在指定可执行文件的文件名
  szCommandLine,  // 命令行参数
  NULL,   // 默认进程的安全性
  NULL,   // 默认线程的安全性
  FALSE,   // 指定当前进程内的句柄不可以被子进程继承
  CREATE_NEW_CONSOLE, // 新的进程创建一个新的控制台窗口
  NULL,   // 使用本进程的环境变量
  NULL,   // 使用本进程的驱动器目录
  &si,
  &pi);

 if(bRet)
 {
  //既然不使用两个句柄,最好是立刻将它们关闭
  ::CloseHandle(pi.hThread);
  ::CloseHandle(pi.hProcess);
  printf(" 新进程的进程ID号:%d/n",pi.dwProcessId);
  printf(" 新进程的主线程ID号:%d/n",pi.dwThreadId);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值