DuplicateHandle 伪句柄 与 实句柄的应用
如果把GetCurrentThread()返回值传递给一个HANDLE句柄,用它进行ResumeThread,结果肯定不是我们想要的。下面的例子详细描述了伪句柄的调用结果:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#pragma warning(disable:4996)
HANDLE hThread = NULL;
unsigned int __stdcall ProcessInfo(void* lp)
{
string str = *(string*)lp;
delete lp;
hThread = GetCurrentThread();
while(true){
SuspendThread(GetCurrentThread());
cout<<str.c_str()<<endl;
}
_endthreadex(0);
return 0;
}
int _tmain()
{
string *pStr = new string;
*pStr = "老婆, I Love You";
unsigned int dwThreadID;
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
HANDLE hCom = (HANDLE)_beginthreadex(&sa, 0, ProcessInfo, (void*)pStr, 0, &dwThreadID);
Sleep(1000);//线程肯定会先执行到SuspendThread,主线程一直在延时,并且全局hThread得到线程的伪句柄
ResumeThread(hThread);
printf("hThread的句柄值是: %d\n", hThread);
Sleep(INFINITE);
CloseHandle(hCom);
return 0;
}
结果显示,hThread是-2,线程没有输出任何东西
修改代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#pragma warning(disable:4996)
HANDLE hThread = NULL;
unsigned int __stdcall ProcessInfo(void* lp)
{
string str = *(string*)lp;
delete lp;
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(),
&hThread, 0, 0, DUPLICATE_SAME_ACCESS);
while(true){
SuspendThread(GetCurrentThread());
cout<<str.c_str()<<endl;
}
_endthreadex(0);
return 0; }
int _tmain()
{
string *pStr = new string;
*pStr = "老婆, I Love You";
unsigned int dwThreadID;
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
HANDLE hCom = (HANDLE)_beginthreadex(&sa, 0, ProcessInfo, (void*)pStr, 0,
&dwThreadID);
Sleep(1000);//线程肯定会先执行到SuspendThread,主线程一直在延时,并且全局hThread得到线程的伪句柄
ResumeThread(hThread);
printf("hThread的句柄值是: %d\n", hThread);
Sleep(INFINITE);
CloseHandle(hCom);
return 0;
}
运行正常
版权声明:本文为博主原创文章,未经博主允许不得转载。
DuplicateHandle 伪句柄 与 实句柄的应用的更多相关文章
- DuplicateHandle伪句柄与实句柄的应用二
//扫描进程列表,获得进程名为 ConsoleApplication2.exe的进程句柄B,把当前进程A的伪 //句柄传递给B,在B进程中关闭它 #include "stdafx.h&quo ...
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...
- java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄
目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...
- java方法句柄-----1.方法句柄类型、调用
目录 方法句柄 1.方法句柄的类型 1.1MethodType类的对象实例的创建 1.1.1 通过指定参数和返回值的类型来创建MethodType.[显式地指定返回值和参数的类型] 1.1.2 通过静 ...
- java方法句柄-----3.方法句柄的实现接口
目录 1.使用方法句柄实现接口 1.使用方法句柄实现接口 2.3节介绍的动态代理机制可以在运行时为多个接口动态创建实现类,并拦截通过接口进行的方法调用.方法句柄也具备动态实现一个接口的能力.这是通 ...
- [转]Windows多进程编程
转自:http://blog.csdn.net/bxhj3014/article/details/2082255 一.进程的概念 进程是是一个正在运行的程序的实例(飘---),是系统分配资 ...
- C++ createprocess 打开word
#define FileName _TEXT("E:\\DuplicateHandle伪句柄与实句柄的应用.docx") void CMFCApplication1Dlg::OnB ...
- Windows核心编程 第六章 线程基础知识 (下)
6.6 线程的一些性质 到现在为止,讲述了如何实现线程函数和如何让系统创建线程以便执行该函数.本节将要介绍系统如何使这些操作获得成功. 图6 - 1显示了系统在创建线程和对线程进行初始化时必须做些什么 ...
- windows核心编程---第三章 内核对象及句柄本质
本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...
随机推荐
- keil 生成bin文件
在 User 配置页面中,提供了三种类型的用户指令输入框,在不同组的框输入指令,可控制指令的执行时间,分别是编译前(Before Compile c/c++ file).构建前(Before Bui ...
- 原生JS获取所有标签的数量并统计每个标签的数量
<script type="text/javascript"> var tags = document.getElementsByTagName('*'); var t ...
- d3基本图形
柱状图 散点图.气泡图 ...
- 使用 Visual Studio Code 进行 Laravel 开发(转)
转自:https://laravelacademy.org/post/8016.html 关于 Laravel 代码开发工具大家各有所好,大部分应该在用 PHPStorm,Sublime 也有很多粉丝 ...
- cenos7配置confluence+mysql5.6
一.准备阶段 我的环境为 腾讯云镜像centos7.4 ,centos 内置 mariadb 需要先删除 #检查是否安装了 mariadb rpm -qa |grep mariadb #删除mari ...
- Spark的任务提交和执行流程概述
1.概述 为了更好地理解调度,我们先看一下集群模式的Spark程序运行架构图,如上所示: 2.Spark中的基本概念 1.Application:表示你的程序 2.Driver:表示main函数,创建 ...
- springboot指定配置文件运行
1.springboot指定配置文件运行 创建三个配置文件如下: application.properties内容如下: spring.profiles.active=rabbit如上配置,在运行时就 ...
- centos yum安装redis,nginx
先安装源 yum install epel-release 之后 分别安装redis,nginx
- UVA - 1423 Guess (拓扑排序)
题意:已知矩阵S,求序列a.已知矩阵Sij = “ + ” if ai + . . . + aj > 0; Sij = “ − ” if ai + . . . + aj < 0; and ...
- HYSBZ - 1588 营业额统计 (伸展树)
题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...