知识点:
进程:正在运行的程序的实例,包括两个部分:一个内核对象,一个地址空间
windows支持的应用程序类型:GUI和CUI两种,一种是图形用户界面,一种是Console用户界面。
Microsoft visual studio 可以通过设置链接器,修改链接器的/subsystem:console或/subsystem:windows,实现切换。操作系统的加载程序loader会检查可执行文件映像的文件头,从而判断执行文件到底是个什么程序。
真正的程序,并不会首先运行我们 提供的main,winmain函数,而是首先运行连接器使用的entry:指定的入口,如mainCRTSTARTUP,winmainCRTStartup
访问C/C++运行库的全局变量,必须要包含stdlib.h文件才可以。
C/C++全局变量有:
__argc
__argv
_winmajor
_winminor
_pgmptr
_environ
_ImageBase 链接器定义的伪变量,应用程序的基地址
GetModuleFileName() 返回执行程序的完整路径
exe文件的加载地址,基于链接器的/base:address确定,vs的默认地址为0x00400000
GetModuleFile()返回执行程序的基地址
//返回exe文件的基地址
GetModuleHAndleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,(PCTSTR)DumpModule,&hModule);
UNREFERENCED_PARAMETER();未使用的变量
4.1.3 进程的命令行参数
GetCommandLine 函数返回的是一个完整的命令行参数,包括执行程序名,而winmain入口函数的pszCmdLine则是去掉了执行程序文件名的参数列表
PWSTR *ppArgv = CommandLineToArgvW(GetCommandLineW(),&nNumArgs)
if(*ppArgv[1] == L'x')
{
}
HeapFree(GetProcessHeap(),0,ppArgv);