windows核心编程 第四章 进程

获得当前目录:
DWORD GetFullPathName(PCTSTR pszFile,DWORD cchPath,PTSTR pszPath,PTSTR *ppszFilePart);

 

获取C盘的当前目录
TCHAR szCurDir[MAX_PATH];
GetFullPathName("C",MAX_PATH,szCurDir,NULL);

获得系统版本:
BOOL GetVersion(POSVERSIONINFO pVersionInformation);


创建进程函数:
BOOL CreateProcess
{
PCTSTR pszApplicationName;//新进程使用的可执行文件的名字
PTSTR pszCommandLine;//传递给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess;//创建进程的安全属性,一般默认为NULL
PSECURITY_ATTRIBUTES psaThread; //创建线程的安全属性,一般默认为NULL
BOOL bInteritHandle;//是否可继承
DWORD fdwCreate;//如何来创建进程
PVOID pvEnvironment;//用于指向包含新进程将要使用的环境字符串的内存块
PCTSTR pszCurDir;//父进程设置目录,NULL为默认程序运行的目录
PSTARTUPINFO psiStartInfo;//指向STARTUPINFO结构,堆栈,最好要先
STARTUPINFO si={sizeof(si)};
GetStartupInfo(&si);(初始化)否则会把无用信息传递给CreateProcess,产生不确定因素
PPROCESS_INFOMATION ppiProcInfo//PROCESS_INFORMATION结构,里面记录该进程的所拥有的线程ID和子进程ID
};

成功返回TRUE //注意,如果创建进程找不到相关的DLL也会返回TRUE;

pszCommandLine最好不要传入常量,VC会把传入的字符串放入只读内存,例如:
CreateProcess(NULL,_T("NOTEPAD"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
将会运行错误(经过自己测试,GCC不会运行错误,VS2005会,书上说早期的VC也不会错误)

最好是:
TCHAR szCommandLine[]=_T("NOTEPAD");
CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
将会打开NOTEPAD程序


TCHAR szPath[]="WORDPAD README.TXT";
CreateProcess("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE",szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
打开NOTEPAD程序,并传入szpaht的命令

fdwCreate 用于规定如何来创建新进程,也可以设定优先级.
EBUG_PROCESS:当子进程发生某些事情,要告诉父进程

DEBUG_ONLY_THIS_PROCESS:和EBUG_PROCESS类似,不过只告诉发生的某些特定时间,比如子进程再创建子进程就不告诉

CREATE_SUSPENDED:子进程创建,父进程挂起

DETACHED_PROCESS:组织基于GUI进程对他的父进程console的访问,并将输出发送到新的console窗口

CREATE_NEW_CONSOLE:创建新进程同时为新进程创建控制台,不可和DETA_PROCESS同时使用,否则产生一个错误

CREATE_NO_WINDOW:不要为新进程创建控制台窗口

CREATE_NEW_PROCESS_GROUP:当创建多个进程后,如果用户按下CTRL+C,那么将会同时告诉所有进程用户按下CTRL+C;

CREATE_DEFAULT_ERROR_MODE:新进程不继承父进程的错误使用模式

CREATE_SEPARATE_WOW_VDM:当在WINDOWS 2000运行16位的时候,创建单独的DOS虚拟机

CREATE_SHARED_WOW_VDM:当在windows 2000运行16位的时候,除非设定CREATE_SHPARATE_WOW_VDM,否则所有16位程序都在单独的DOS虚拟机运行,但是可以改变注册表共享

CREATE_FORCEDOS:强制系统运行嵌入16位OS/2应用程序的MOS-DOS应用程序

CREATE_BREAKAWAY_FROM_JOB:使用作业中的金衡生成一个与作业相关联的新进程

终止运行进程:
1.主线程函数返回(最好的方法)
2.进程中的线程调用ExitProcess(最好不要);
3.另外一个进程中的线程(最好也不要);
4.所有线程自行终止

BOOL TerminateProcess(HANDLE hProcess,UINT fuExitCode);
与EixtProcess差别:任何线程都可以调用TerminateProcess

获得目前已经撤销进程的退出代码
BOOL GetExitCodeProcess(HANDLE hProcess,PDWORD pdwExitCode);

CloseHandle(HANDLE hProcess);关闭不用的句柄,很重要

DWORD WaitForSingleObject(HANDLE hObject,DWORD dwTimeout);
等待hObject终止运行

PVOID GetModulePreferredBaseAddr(DWORD dwProcessID,PVOID pvModuleRemote);
接受一个进程ID和进程模块的地址

 

posted @ 2010-10-16 19:42  linyilong  阅读(420)  评论(0编辑  收藏  举报