前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >创建线程的方式打开记事本

创建线程的方式打开记事本

作者头像
浪漫主义狗
发布于 2023-09-20 01:06:09
发布于 2023-09-20 01:06:09
29400
代码可运行
举报
文章被收录于专栏:HAUE_LYS'BlogHAUE_LYS'Blog
运行总次数:0
代码可运行

今天操作系统课老师讲到进程,提出了一个有趣的小实验:能否以系统调用的方式利用 Windows 创建进程的系统调用函数来打开一个软件。闲着蛋疼的我立马来了兴趣,姑且写一个玩玩(

头文件

  • <windows.h>:包含了 Windows API 的核心功能。
  • <tchar.h>:提供了一种跨平台的方式来处理 UnicodeANSI 字符集,防止出现一些编码错误。
  • <cstdio>:包含了 C 标准输入输出函数的声明。

CreateThread

CreateThread Windows API 中的一个函数,用于创建一个新的线程。

这就是我们程序的核心函数,其函数的原型如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

参数说明:

  • lpThreadAttributes:指向SECURITY_ATTRIBUTES结构的指针,用于指定新线程的安全性。可以设置为NULL,表示使用默认的安全性。
  • dwStackSize:指定新线程的堆栈大小。可以设置为0,表示使用默认的堆栈大小。
  • lpStartAddress:指向线程函数的指针,表示新线程的入口点。线程函数的原型为DWORD WINAPI ThreadProc(LPVOID lpParameter),其中lpParameter为传递给线程函数的参数。
  • lpParameter:传递给线程函数的参数,可以是任意类型的指针。
  • dwCreationFlags:指定线程的创建标志。可以设置为0,表示无特殊标志。
  • lpThreadId:指向DWORD类型变量的指针,用于接收新线程的标识符。

即:CreateThread 函数创建一个新的线程,并返回该线程的句柄。如果创建线程成功,返回值为线程的句柄;否则返回值为NULL。

句柄

  • 有趣的是,在 Windows 里并没有进程层次的概念,所有进程的地位都是相同的。
  • 在创建进程时,父进程会得到一个特别令牌(句柄),用于控制子进程。
  • 该令牌是可以传递的,即父进程有权将该令牌传递给其他进程,以至于不存在了进程层次的概念。

注意

  • 新线程的入口点是通过 lpStartAddress 参数指定的线程函数。线程函数在新线程中执行,可以执行各种任务。
  • 线程函数的返回值是一个 DWORD 类型的值,表示线程的退出码。
  • 通过 CreateThread 函数创建的线程是可执行的,它可以并发地与其他线程执行,但线程的执行顺序和调度由操作系统决定。
  • 在使用CreateThread函数创建线程后,需要使用 CloseHandle 函数关闭线程句柄,以释放资源。

实现代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <windows.h>
#include <tchar.h>
#include <cstdio>

DWORD WINAPI OpenNotepadThread(LPVOID lpParam) {
    // 定义要打开的应用程序的路径
    LPCTSTR appName = _T("notepad.exe");

    // 创建进程信息结构体
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInfo;

    // 初始化进程信息结构体
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    ZeroMemory(&processInfo, sizeof(processInfo));

    // 创建新进程
    if (!CreateProcess(
        NULL,                   // 指向可执行文件名的指针
        (LPTSTR)appName,        // 命令行参数
        NULL,                   // 进程句柄不可继承
        NULL,                   // 线程句柄不可继承
        FALSE,                  // 不继承句柄
        0,                      // 无特殊标志
        NULL,                   // 使用父进程的环境变量
        NULL,                   // 使用父进程的工作目录
        &startupInfo,           // 启动信息
        &processInfo            // 进程信息
    )) {
        _tprintf(_T("WRONGING:%d\n"), GetLastError());
        return 1;
    }

    // 等待新进程结束
    WaitForSingleObject(processInfo.hProcess, INFINITE);

    // 关闭进程和线程句柄
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return 0;
}

int main() {
    // 创建线程
    HANDLE hThread = CreateThread(NULL, 0, OpenNotepadThread, NULL, 0, NULL);

    if (hThread == NULL) {
        _tprintf(_T("WRONGING:%d\n"), GetLastError());
        return 1;
    }

    // 等待线程结束
    WaitForSingleObject(hThread, INFINITE);

    // 关闭线程句柄
    CloseHandle(hThread);

    return 0;
}

在上述代码中,我定义了一个名为 OpenNotepadThread 的函数,它是一个线程函数,用于打开记事本应用程序。该函数的参数类型为LPVOID,表示一个指向任意类型的指针。然后创建进程信息结构体 STARTUPINFOPROCESS_INFORMATION,并对其进行了初始化。

接下来调用 CreateProcess 函数用于创建一个新的进程,返回进程的句柄和线程的句柄。它的参数包括可执行文件名、命令行参数、进程句柄和线程句柄是否可继承等信息。如果创建进程成功,返回值为 1;否则返回值为 0

调用 WaitForSingleObject 函数用于等待一个对象的状态变为可信,即等待进程结束。它的参数包括要等待的对象句柄和等待的时间,这里使用 INFINITE 表示无限等待,直到进程结束。

当进程结束后,需要调用 CloseHandle 函数关闭进程和线程的句柄,释放资源。

测试效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
自动化-Appium-​第一个Demo-混合(Python版)
App是移动混合应用程序,即在移动应用程序中嵌入了Webview,通过Webview访问网页。
wangmcn
2022/07/25
2.7K0
自动化-Appium-​第一个Demo-混合(Python版)
自动化-Appium-​第一个Demo-Web(Python版)
本章Web所指的是移动端(模拟器/真机)里的浏览器(如:Chrome、Safari)。
wangmcn
2022/07/25
2.6K0
自动化-Appium-​第一个Demo-Web(Python版)
appium+python自动化59-多台设备并行
做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行。有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性。 这就需要启动多个appium服务了,并且android设备和appium要一一对应才行。
上海-悠悠
2018/07/25
6K1
appium+python自动化59-多台设备并行
自动化-Appium-微信小程序(Python版)
微信小程序其实也是正常的webview,但需要在微信里打开X5调试页面进行设置,脚本添加androidProcess参数才可以执行自动化测试。
wangmcn
2022/07/25
5.7K0
自动化-Appium-微信小程序(Python版)
Appium+python自动化(七)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 上(超详解)
  “千呼万唤始出来,犹抱琵琶半遮面”,经过前边的各项准备工作,终于才把appium这位琵琶女请出来。那么下边就由宏哥给各位看官、小伙伴们和童鞋们来引荐这位美女(帅哥)。这一篇主要是对前边的内容做一个小小的总结,我们不能只顾得埋头拉车,不记得抬头看路可不行哦!
北京-宏哥
2019/06/25
2.7K0
Appium+python自动化(七)-  初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 上(超详解)
自动化-Appium-环境搭建-IOS(Python版)
Xcode如何下载安装或更新呢?打开Mac机上的App Store,搜索Xcode,进行安装或者更新,注意观察下Xcode的更新日志,可以看到当前版本支持的IOS SDK版本。
wangmcn
2022/07/25
5.4K0
自动化-Appium-环境搭建-IOS(Python版)
自动化-Appium-第一个Demo-原生(Java版)
4、创建lib文件夹,用来存放jar包。把Appium Clients jar和Selenium jar包拷贝到文件夹里。
wangmcn
2022/07/25
2.2K0
自动化-Appium-第一个Demo-原生(Java版)
自动化-Appium-第一个Demo-原生(Python版)
1、启动PyCharm,创建My_Appium_Demo项目。创建demo包,之后创建脚本文件。例如:模拟器示例为Android_App_Simulator,真机示例为Android_App_RealMachine
wangmcn
2022/07/25
2.3K0
自动化-Appium-第一个Demo-原生(Python版)
自动化-Appium-环境搭建-IOS(Java版)
Xcode如何下载安装或更新呢?打开Mac机上的App Store,搜索Xcode,进行安装或者更新,注意观察下Xcode的更新日志,可以看到当前版本支持的IOS SDK版本。
wangmcn
2022/07/25
5.8K0
自动化-Appium-环境搭建-IOS(Java版)
Appium+python自动化(六)- 连接模拟器并启动淘宝APP(超详解)
  上一篇讲解完模拟器的安装、配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑版的虚拟手机),然后再安装一款APP-淘宝为例。
北京-宏哥
2019/06/25
6K0
Appium+python自动化(六)-  连接模拟器并启动淘宝APP(超详解)
Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)
前边介绍的都是通过按钮点击启动按钮来启动appium服务,有的小伙伴或者童鞋们乍一听可能不信,或者会问如何通过命令行启动appium服务呢?且听宏哥一一道来。
北京-宏哥
2019/09/11
6.7K0
Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)
Python + Appium 自动化操作微信入门看这一篇就够了
Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。
Python小二
2020/11/06
4.7K0
Python + Appium 自动化操作微信入门看这一篇就够了
自动化-Appium-微信公众号(Python版)
微信公众号其实也是正常的webview,但需要在微信里打开X5调试页面进行设置,脚本添加androidProcess参数才可以执行自动化测试。
wangmcn
2022/07/25
2.9K0
自动化-Appium-微信公众号(Python版)
Python+Appium运行简单的demo,你需要理解Appium运行原理!
通过 Http 通信,没有改变浏览器访问系统的属性,只要访问就可以了。 Appium 做自动化也是如此。
清菡
2020/09/20
2.4K0
自动化-Appium-第一个Demo-混合(Java版)
App是移动混合应用程序,即在移动应用程序中嵌入了Webview,通过Webview访问网页。
wangmcn
2022/07/25
2.6K0
自动化-Appium-第一个Demo-混合(Java版)
win10上搭建appium自动化环境
以前都是在mac机器上搭建环境,觉得好麻烦,自己还曾今写了个脚本来一键搭建。 现在在win10上搭建,发现开始很容易,也会有一些坑。把这些坑都记录下来,也许将来可以翻翻。 前面已经搭建了java,android,node的环境,现在搭建appium是水到渠成了。 先去看看最新的版本是啥。打开官网appium.io有点慢,耐心等待。
赵云龙龙
2020/03/26
1.1K0
win10上搭建appium自动化环境
Appium自动化环境安装
转载至我同事https://www.cnblogs.com/gqv2009/p/12620773.html#autoid-0-0-0
小小咸鱼YwY
2020/06/19
8560
Appium自动化环境安装
Appium + Python App自动化(2)第一个脚本
【1】打开你的夜神模拟器(或者连接你的手机) 【2】打开桌面的Appium 【3】下载你要测的App的apk文件,放到桌面 【4】拖动你的apk安装包到夜神模拟器里,然后模拟
孟船长
2018/05/18
1.5K1
手机 上来 个自动 Appium+Python3+夜神安卓模拟器 实现QQ自动登录
背景: 有些app, 无法通过抓包实现数据采集, 也根本抓不到包, 所以就只能拿出终极秘密武器Appium了
不止于python
2022/05/31
1.3K0
手机 上来 个自动 Appium+Python3+夜神安卓模拟器 实现QQ自动登录
自动化-Appium-通过WiFi连接真机进行自动化测试(Python版)
本章示例为Android版本进行讲解(Windows与Mac环境下操作基本一致,此次示例为在Windows环境)。
wangmcn
2022/07/25
2K0
自动化-Appium-通过WiFi连接真机进行自动化测试(Python版)
推荐阅读
相关推荐
自动化-Appium-​第一个Demo-混合(Python版)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档