
基础知识
1.一般将进程定义为一个正在运行的程序的一个实例,有两部分构成:
a.一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程体积信息的地方。
b.一个地址空间,其中包含所有可执行文件(executable)或DLL模块的代码和数据。此外,它还包含动态内存分配,比如线程堆栈和堆的分配。
2.进程是有“惰性”的。进程要做任何事情,都必须让一个线程在它的上下文中运行。如果没有线程要执行进程地址空间包含的代码,进程就失去了继续存在的理由。这是系统会自动销毁进程及其地址空间。
3.对于所有要运行的线程,操作系统会轮流为每个线程调度一些CPU时间。它会采取循环(round-robin,轮询或轮流)方式,为每个线程都分配时间片(称为“量”或者“量程”,即quantum),从而营造出所有线程都在“并发”运行的假象。
4.Windows支持两种类型的应用程序:GUI程序和CUI程序。前者是“图形用户界面”(Graphical User Interface)的简称,后者是“控制台用户界面”(Console User Interface)的简称。
5.Windows应用程序可以使用以下两种入口函数:_tWinMain()和_tmain()。
6.加载到进程地址空间的每一个可执行文件或者DLL文件都被赋予了一个独一无二的实例句柄。可执行文件的实例被当作(w)WinMain函数的第一个参数hInstanceExe传入。在需要加载资源的函数调用中,一般都要提供此句柄的值。
7.为了知道一个可执行文件或DLL文件被加载到进程地址空间的什么位置,可以使用如下的GetModuleHandle函数来返回一个句柄/基地址:
HMODULE GetModuleHandle(PCTSTR pszModule);
8.每个进程都有一个与它关联的环境块(environment block),这是在进程地址空间内存分配的一块内存。
9.进程中的线程可以在主机的任何CPU上执行。然而,也可以强迫线程在可用CPU的一个子集上运行,这称为“处理器关联性”(processor affinity)。
10.如果不提供完整的路径名,各种Windows函数会在当前驱动器的当前目录查找文件和目录。
11.可以用GetVersion函数获取用户运行的Windows系统版本。
常用函数
两种入口点函数“
1 2 3 4 5 |
Int WINAPI _tWinMain( HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow); |
1 2 3 4 |
int _tmain( int argc, TCHAR *argv[], TCHAR *envp[]); |
1.GetModuleHandle函数:返回句柄/基地址
1 2 3 |
HMODULE WINAPI GetModuleHandle( _In_opt_ LPCTSTR lpModuleName ); |
2.GetEnvironmentVariable函数:获取环境变量。
1 2 3 4 5 |
DWORD WINAPI GetEnvironmentVariable( _In_opt_ LPCTSTR lpName, _Out_opt_ LPTSTR lpBuffer, _In_ DWORD nSize ); |
本文链接地址: Windows via C/C++ Chapter 4 : 进程 – 第一个程序
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。