Icebound

icebound-area

智障学写程序系列①【不定期更新】

被我从QQ空间腾过来的:
最近感觉自己有些堕落,竞赛挂了以后博客也没再更过。。因为最近要换个主机。。
所以先在这里写啦。。
天天在学校狂写作业感觉都学傻了。为了贯彻落实笨鸟先飞智障先跑的精神。。。
于是决定重试一下 注意是试。。。。
当然不是继续学算法。。。当然是玩点好玩的。。。。
于是我决定去搞搞windows API什么的。。大学就预定软工了。。。就这样和计科远离了。。

不过都不好说吧。。。
进入正题。。。实在不知道从哪学起。。决定从最基本的进程和线程下手。。。
【以下内容都是我刚学的,要是说错了你们可以喷我】
【你打我啊】
windows内部大概是这样的:
进程是一个大罐子,它内部有好多零件和燃料,比如虚拟内存地址,代码,数据,资源。
然而一个大罐子并不可以干活,他需要小机器人帮忙。。没有小机器人的大罐子是要被拆了的(销毁)
这些消耗零件和燃料的小机器人叫线程,线程是执行进程代码的实体。
还有一点,由于进程这个大罐子太大了。。我们没法直接管理它。。
我们只能通过一个叫做进程内核对象的小数据结构来管理大罐子。
进程内核对象只能由系统内核访问,相当于封装了细节。
然而和进程内核对象的交♂互♀需要通过句柄。。。
于是大概是这样的:
我->句柄->进程内核对象->进程
前面都是废话,恩。。
我们使用STARTUPINFO类型来描述一个进程。。
这个结构体里面有一堆东西。。太多了就不说了。。
特别注意的是STARTUPINFO.cb必须初始化为sizeof(STARTUPINFO) 鬼知道为啥
然后当我们往这个STARTUPINFO里面塞满东西之后,通过CreateProcess函数就能创建一个新进程了。
当然,我们需要一个小机器人在这个罐子里工作。
通过PROCESS_INFORMATION来描述一个线程,一并传入CreateProcess即可。
我们获取了两个句柄:一个hProcess进程句柄 一个hThread线程句柄
通过这两个句柄我们干啥都行。。
例如关闭一个进程:TerminateProcess(HANDLE,UNIT) 两个参数一个是句柄一个是退出代码
这就是我今天学的一点点东西。。。不过足够我写一个【运行】了。。
【VS被我搞坏了。。只好用DEVCPP】
写了一个带关闭功能的【运行.exe】。。
当然这个运行是不能运行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;
}
下周/明天 继续玩这个。。
  1. 4jf说道:

    辣鸡程序过不了编译