PoEdu培训 Windows班 第十四课 Windows进程和线程
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第十四课 Windows进程和线程

文章类别: 培训笔记 0 评论

Windows 进程及线程

进程的组成

内核对象

操作系统用来管理进程的

地址空间

包含了可执行文件及DLL模块的代码和数据

应用程序类型

控制台用户界面

图形用户界面

区别

  1. 在VS中, CUI程序的链接器开关为/SUBSYSTEM:CONSOLE, GUI程序的链接器开关为/SUBSYSTEM:WINDOWS

    • 在加载时, 会获取这个值
    • 如果是一个文本控制台窗口, 操作系统会使用命令提示符启动这个程序
    • 否则, 操作系统加载这个程序后, 由应用程序来管理自己的窗口
  2. 入口函数不同

    • GUI的入口函数是 _tWinMain
INT WINAPI _tWinMain(
    HINSTANCE hInstanceExe,
    HINSTANCE hPreInstance,
    PTSTR pszCmdLine,
    INT nCmdShow);
INT _tmain(
    INT argc,
    TCHAR* argv[],
    TCHAR* envp[]);
  1. 启动函数不同

    • GUI的启动函数为 WinMainCRTStartupwWinMainCRTStartup
    • CUI的启动函数为 mainCRTStartupwmainCRTStartup

进程实例句柄

加载到进程地址空间的每一个执行体或者DLL文件, 都被赋予了一个独一无二的实例句柄

#include <stdio.h>
#include <Windows.h>

int main()
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    printf("0x%x\n", hInstance);

    return 0;
}

HMODULE和HINSTANCE是一摸一样的的东西, 没有任何区别

进程的命令行参数

#include <stdio.h>
#include <Windows.h>

int main()
{
    TCHAR* /*const*/ szCommandLine = GetCommandLine();
    // 需要注意的是, szCommandLine 尽量不要修改, 会影响全局的内容
    // 也不要尝试去手动释放这一块空间
    int nArgc;
    TCHAR** ppArgv = CommandLineToArgvW(szCommandLine, &nArgc);
    if (ppArgv)
    {
        for (int i = 0; i < nArgc; ++i)
        {
            _tprintf(TEXT("%s\n"), ppArgv[i]);
        }
    }
    LocalFree(ppArgv);  // 释放

    return 0;
}

进程的环境变量

#include <stdio.h>
#include <Windows.h>

int main()
{
    // 获取环境变量
    LPTCH szPath = GetEnvironmentStrings();
    _tprintf(TEXT("%s\n"), szPath);
    // 释放资源
    FreeEnvironmentStrings(szPath);

    return 0;
}

这里需要注意的是:

环境变量的其他函数:
GetEnvironmentVariable
获取某个环境变量的值

DWORD WINAPI GetEnvironmentVariable(
  _In_opt_  LPCTSTR lpName,     // 要获取的环境变量的名称
  _Out_opt_ LPTSTR  lpBuffer,   // 要存放值的内存地址
  _In_      DWORD   nSize       // buff的大小
);

SetEnvironmentVariable
设置某个环境变量的值
注意, 调用此方法后, 并不影响系统本身的设置, 也不影响其他应用程序的环境变量, 仅对当前应用程序生效

BOOL WINAPI SetEnvironmentVariable(
  _In_     LPCTSTR lpName,      // 环境变量的名称
  _In_opt_ LPCTSTR lpValue      // 环境变量的值
);

未完待续...

如有错误,请提出指正!谢谢.

回复