被我从QQ空间腾过来的:
最近感觉自己有些堕落,竞赛挂了以后博客也没再更过。。因为最近要换个主机。。
所以先在这里写啦。。
所以先在这里写啦。。
天天在学校狂写作业感觉都学傻了。为了贯彻落实笨鸟先飞智障先跑的精神。。。
于是决定重试一下 注意是试。。。。
当然不是继续学算法。。。当然是玩点好玩的。。。。
于是我决定去搞搞windows API什么的。。大学就预定软工了。。。就这样和计科远离了。。
不过都不好说吧。。。
进入正题。。。实在不知道从哪学起。。决定从最基本的进程和线程下手。。。
【以下内容都是我刚学的,要是说错了你们可以喷我】
【你打我啊】
windows内部大概是这样的:
进程是一个大罐子,它内部有好多零件和燃料,比如虚拟内存地址,代码,数据,资源。
然而一个大罐子并不可以干活,他需要小机器人帮忙。。没有小机器人的大罐子是要被拆了的(销毁)
这些消耗零件和燃料的小机器人叫线程,线程是执行进程代码的实体。
还有一点,由于进程这个大罐子太大了。。我们没法直接管理它。。
我们只能通过一个叫做进程内核对象的小数据结构来管理大罐子。
进程内核对象只能由系统内核访问,相当于封装了细节。
然而和进程内核对象的交♂互♀需要通过句柄。。。
于是大概是这样的:
我->句柄->进程内核对象->进程
前面都是废话,恩。。
我们使用STARTUPINFO类型来描述一个进程。。
这个结构体里面有一堆东西。。太多了就不说了。。
特别注意的是STARTUPINFO.cb必须初始化为sizeof(STARTUPINFO) 鬼知道为啥
然后当我们往这个STARTUPINFO里面塞满东西之后,通过CreateProcess函数就能创建一个新进程了。
当然,我们需要一个小机器人在这个罐子里工作。
通过PROCESS_INFORMATION来描述一个线程,一并传入CreateProcess即可。
我们获取了两个句柄:一个hProcess进程句柄 一个hThread线程句柄
通过这两个句柄我们干啥都行。。
例如关闭一个进程:TerminateProcess(HANDLE,UNIT) 两个参数一个是句柄一个是退出代码
这就是我今天学的一点点东西。。。不过足够我写一个【运行】了。。
【VS被我搞坏了。。只好用DEVCPP】
写了一个带关闭功能的【运行.exe】。。
当然这个运行是不能运行secpol.msc这类东西的。。。
当然这个运行是不能运行secpol.msc这类东西的。。。
【我学着写英文注释了。。】
下面程序有一个问题,应该是在VS2010以上是编译不过的
CreateProcess里面的LPTSTR lpCommandLine在VS2010默认是LPWSTR 直接传char*进去会死
值得注意的几点:
1.wShowWindow必须设置成TRUE 否则子进程不会显示
2.STARTUPINFO的初始化
3.注意销毁不用的句柄
然后就是丑的一比的代码
#include #include #include #include #include using namespace std; PROCESS_INFORMATION p;//new thread STARTUPINFO s={(sizeof s)};//new process char command[200]; int main(int argc,char* argv[]) { gets(command); s.dwFlags=STARTF_USESHOWWINDOW;//use showwindow s.wShowWindow=1;//can be seen bool ret=CreateProcess( NULL,//no name command, NULL,//security NULL,//security 0,//can not inheritance CREATE_NEW_CONSOLE, NULL, NULL, &s, &p); if(ret) { cout<<"it works!"<<endl; cout<<endl<<endl; cout<<"input any key to stop it"<<endl; getchar(); TerminateProcess(p.hProcess,0); CloseHandle(p.hProcess); CloseHandle(p.hThread); } else cout<<"error"<<endl; return 0; }
下周/明天 继续玩这个。。
辣鸡程序过不了编译