现在的位置: 首页 > 综合 > 正文

进程的一些理解1

2013年02月28日 ⁄ 综合 ⁄ 共 1992字 ⁄ 字号 评论关闭

《Windows程序设计》先放下了,不知道为什么,看不下去了,后面的感觉不是那么重要。

开始了《Windows核心编程》。


《Windows核心编程》进程
可以说是读书笔记吧,怎么样从书中提取到对自己有用的东西,是一门学问,本人正在学习中,写的不好,大家见谅。

一般将进程定义为一个正在运行的程序的实例,它由以下两部分构成:
1、一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。
2、一个地址空间,其中包括所有可执行文件或DLL模块的代码和数据。此外,还包含动态内存分配,比如线程堆栈和堆的分配。
实际执行程序的是进程内的线程。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PTSTR szCmdLine,int iCmdShow);
hInstance是一个实例句柄,一般常用于加载资源。hInstance实际是一个内存基地址。

HMODULE GetModuleHandle(LPCTSTR lpModuleName);
获取一个应用程序或动态链接库的模块句柄。其实也是一个地址。
前提:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。

LPVOID p=GetEnvironmentStrings();为当前进程返回系统环境变量
FreeEnvironmentStrings(p);释放系统环境变量
可以使用下面代码的输出看一下:
    LPWCH p=GetEnvironmentStrings();
    printf("%S\n",p);
    FreeEnvironmentStrings(p);
    
DWORD GetEnvironmentVariable(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nSize);
判断一个环境变量是否存在,并获取它的值。

void PrintfEnvironmenVariable(PCTSTR pszVariableName)
{
    PTSTR pszValue=NULL;
    DWORD dwResult=GetEnvironmentVariable(pszVariableName,pszValue,0);
    if(dwResult!=0)
    {
        DWORD size=dwResult*sizeof(TCHAR);
        pszValue=(PTSTR)malloc(size);
        GetEnvironmentVariable(pszVariableName,pszValue,size);
        _tprintf(TEXT("%s=%s\n"),pszVariableName,pszValue);
        free(pszValue);
    }
    else
    {
        _tprintf(TEXT("'%s'=<unknown value>\n"),pszVariableName);
    }
}

添加一个变量,删除一个变量,或者修改一个变量,pszValue为NULL,则从环境块中删除。
BOOL SetEnvironmentVariable(PCTSTR pszName,PCTSTR pszValue);

进程的错误模式:
与每个进程都关联了一组标志,这些标志的作用是让系统知道进程如何响应严重错误,包括磁盘介质错误、未处理的异常、文件查找错误以及数据对齐错误等。
进程可以调用SetErrorMode来告诉系统如何处理这些错误。
UINT SetErrorMode(UINT fuErrorMode);
默认情况下,子进程会继承父进程的错误模式标志。

进程当前所在的驱动器和目录,可以使用下面两个函数来获取和设置其所在进程的当前驱动器和目录。
WinDef.h文件中被定义为260的常量MAX_PATH是目录名称或文件名称的最大字符数,一般使用MAX_PATH。
DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);
nBufferLength 缓冲区的长度;lpBuffer 指定一个预定义字串,用于装载当前目录;
调用成功 返回装载到lpBuffer的字节数,如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度。
BOOL SetCurrentDirectory(PCTSTR pszCurDir);切换当前进程的当前工作目录。

系统版本:
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO *)&os);//调用GetVersionEx函数OSVERSIONINFOEX结构必须将指针类型强制转换

抱歉!评论已关闭.