S_OK,S_FALSE,E_FAIL

2023-05-16

今天在调试一个ICOP的操作的时候,发现连接被动关闭的时候老是会在一处断言处失败,跟了很久终于发现了问题。在此记录一下:

断言报错的代码如下:

HRESULT CIoCPWorker::UnregIoTask(HRESULT hIokey)
{
	ENTER_CALL("CIoCPWorker_UnregIoTask");
	ASSERT_(SUCCEEDED(hIokey));
	_IoCallback* pIo = reinterpret_cast<_IoCallback*>(hIokey);
	if(pIo->pendingCount._GetCount() == 0)
	{
		TRACE2_L3("--UnregIoTask(), unreg iocp task, fd=%i, io map size=%i\n", 
			pIo->fd, m_ioHandleMap.size() - 1);
		SOCKET temp = pIo->fd;
		m_ioHandleMap.erase(temp);
		return S_OK;
	}
	else
	{
		ASSERT_(pIo->pTask);
		pIo->pTask = NULL;
		TRACE2_L3("--UnregIoTask(), unreg iocp task, fd=%i, io doing=%i\n", 
			pIo->fd, pIo->pendingCount._GetCount());
		return E_FAIL;
	}
}

调用的代码如下:

// 被动关闭/关闭超时
void CTcpPort::EndClose(HRESULT reason)
{
	ENTER_CALL("CTcpPort_EndClose");
	TRACE3_L4("--(%i,%i)EndClose(), reason=%x\n", m_s, m_s2, reason);
	if(m_pPortSink)
	{
		TRACE3_L4("--(%i,%i)EndClose(), report close, reason=%x\n", m_s, m_s2, reason);
		m_pPortSink->OnClose(reason);
		m_pPortSink = NULL;
	}
	if(SUCCEEDED(m_regKey) && reason != S_OK)
	{
		HRESULT hr = m_pIoWorker->UnregIoTask(m_regKey);
		ASSERT_(SUCCEEDED(hr));
		m_regKey = E_FAIL;
		if(m_hClosingTimer)
		{
			m_pThreadsPool->UnregTimer(this,eClosingHandle);
			m_hClosingTimer = NULL;
		}
		Release();
	}
}

运行的时候在 ASSERT_(SUCCEEDED(hr)); 的地方失败。

看了一下S_OK和SUCCEEDED的声明:

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)


#define S_OK ((HRESULT)0x00000000L)

#define S_FALSE ((HRESULT)0x00000001L)


#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)

#define FAILED(hr) ((HRESULT)(hr) < 0)

和S_OK放在一起的是S_FALSE,怀疑和这个有关,上网查了一下,果然如此!

S_OK是COM服务器返回正确

S_FALSE是COM服务器返回错误,不过这个错误是可以不处理的,不影响程序正常运行。只是结果不是想要的

E_FAIL是必须处理的错误。

返回E_FAIL,是告诉调用程序--某些地方出错,必须进行处理。否则,程序不能进行下去了。
返回S_FALSE,不是表示出现错误。
而S_OK和S_FALSE,则程序逻辑的不同表示。如果将它们表示成S_1和S_2可能更好理解些!
调用程序只需对返回的S_OK和S_FALSE进行判断,然后决定程序的走向。
最主要的误解是由S_FALSE的名称带来的。  

 所以在使用SUCCEEDED和FAILED来判断返回值的时候,需注意S_FALSE也表示成功,只是其结果并不是想要的,因此FAILED(S_FALSE)返回为"非",SUCCEEDED同理。

当自己写的函数接口返回值为HRESULT的时候,如果想要指明其出错,并且必须被处理时,应返回E_FAIL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

S_OK,S_FALSE,E_FAIL 的相关文章

随机推荐

  • jmeter多用户并发测试

    0 总体结构 1 测试计划 gt 添加 gt 线程 xff08 用户 xff09 gt 线程组 2 线程组 gt 添加 gt 取样器 gt HTTP请求 注意本项目登录请求为GET 其他项目可能为POST 3 HTTP请求 gt 添加 gt
  • 练习java文档java.util.logging.ConsoleHandler

    ConsoleHandler 方法 close 相当于flush publish span class token keyword import span span class token namespace java span class
  • 轻量级JavaEE第1章课后习题1

    1 为什么说经典javaee开发和运行成本会比轻量级javaee更高 xff1f 答 可能是因为专业的JavaEE服务器要钱 xff0c 而简单的Web服务器不需要钱 2 EAO和DAO的区别是什么 xff1f 什么叫实体 Entity x
  • 请教:如何知道当前所用的gcc调用的是哪个版本的glibc库?及这个glibc库的位置?谢谢!

    http topic csdn net u 20090608 15 36bf4a6c cdf5 4e05 90f3 c0ac0d3f6743 html 6533 请教 xff1a 如何知道当前所用的gcc调用的是哪个版本的glibc库 xf
  • 深入C语言之字节对齐 - [C 数据结构 算法]

    在C程序设计中我们经常需要用到一种数据类型的长度 占内存的字节数 例如 int p 61 NULL p 61 int malloc 10 sizeof int 用sizeof int 来的到int类型的长度 用sizeof可得到C语言中数据
  • 组合导航(GNSS+惯性导航)

    一 GNSS 至少需要四颗星 怎么判断GNSS数据是否准确 xff1f 数据中是否携带星数 xff1f 二 惯性导航 关于磁力计的使用 xff1a 1 xff09 类似重力 xff0c 磁力也是一个矢量 地球任意位置的磁力在东北天地理系下的
  • VR/AR技术杂选

    相机频率 xff1a 一般来说 xff0c 相机频率60Hz是指相机的帧率为60fps xff0c 即frame per second 每秒钟60帧 红外探测器 xff1a 分为两种 xff0c 一种是基于光电特性 xff0c 一种是基于热
  • 百度2014校园招聘-研发工程师笔试题(济南站)

    一 xff0c 简答题 30分 1 xff0c 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f xff08 10分
  • 生产者消费者模式代码实现

    生产者消费者模式 xff1a 不同种类的线程间针对同一个资源的操作 问题 xff1a A xff1a 如果消费者先抢到cpu的执行权 xff0c 就会去消费数据 xff0c 但是现在的数据是默认值 xff0c 没有意义 xff0c 应该等着
  • 转载 本机运行x程序出现:Can't open display 原因及其解决方法

    在Linux Unix类操作系统上 DISPLAY用来设置将图形显示到何处 直接登陆图形界面或者登陆命令行界面后使用startx启动图形 DISPLAY环境变量将自动设置为 0 0 此时可以打开终端 输出图形程序的名称 比如xclock 来
  • 另一种root方法,Android boot.img破解

    一 破解原理 nbsp nbsp nbsp Android手机获得Root权限 其实就是让 system和 data分区获得读写的权限 这两个分区的权限配置 一般在根分区的init rc文件中 修改这个文件可永久获得root权限 众所周知
  • BPMN基础元素及任务类型

    01 BPMN定义 BPMN xff08 Business Process Modeling Notation xff0c 即业务流程建模符号 xff09 xff0c 是一种流程建模的通用和标准语言 xff0c 用来绘制业务流程图 xff0
  • Python 程序出现ImportError: cannot import name 'is_string_like' 解决办法

    今天的一个project写了如下代码 xff1a from skimage import os xff0c transform 运行后报错 xff1a from matplotlib cbook import is string like
  • ASP.NET中主题的创建和应用

    1创建ASP NET网站 模板 gt 选择 添加ASP NET文件夹 下面的属性 xff0c 将主题名改为 xff1a mytheme xff1b 添加新建项选择 外观文件 xff0c 命名为TextBox 双击TextBox skin文件
  • canvas画波形图

    最近公司要在浏览器上加个波形图 xff0c 本人搞C 43 43 的 xff0c 不会html5 xff0c 在网上搜了半天没找到一个例子 xff0c 只好自己研究了 郁闷啊 画这个图主要用到html5的canvas xff0c 不多说 x
  • layer 弹框 cropper 裁剪上传图片,thinkphp 3 使用 CropAvatar.class.php

    最近要做一个上传裁剪图片功能 xff0c 但是网上收出来的东西 xff0c 知识点都是对的 但是就是没说清楚 xff0c 也无法连续起来用 经过自己整理出来的一套代码 xff0c 亲测可用 xff01 不用多说 xff0c 直接上菜 PS
  • 解决mysql登录出现10061的问题

    问题出现的原因 xff1a 可能是系统自动关闭了mysql服务的运行 解决方法 xff1a 任务管理器 文件 运行新任务 services msc 找到mysql 启动即可成功 任务管理器 文件 运行新任务 services msc 找到m
  • Archlinux配置邮件(以qq邮箱为例)

    Archlinux配置邮件 以qq邮箱为例 安装s nail span class token function sudo span pacman S s nail 配置SMTP发送邮件 开启IMAP SMTP服务 打开qq邮箱网页版 gt
  • 电子爱好者总结的28个电子行业技术网站

    以下是一位电子爱好者总结的28个电子行业技术网站 21IC 电子 http www 21IC COM 中国电子资源网 xff1a http www ec66 com 中国电子进修网 http www studydz com 电子设计技术网
  • S_OK,S_FALSE,E_FAIL

    今天在调试一个ICOP的操作的时候 xff0c 发现连接被动关闭的时候老是会在一处断言处失败 xff0c 跟了很久终于发现了问题 在此记录一下 xff1a 断言报错的代码如下 xff1a HRESULT CIoCPWorker UnregI