[AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性

news2024/11/23 21:16:35

目录

背景描述

 用浏览器访问,正常返回

​编辑

 AHK v2官方示例源代码

 AHK v2运行结果报错(0x80092004) 找不到对象或属性

用thqby大佬的WinHttpRequest.ahk库测试报错 0x80092004 找不到对象或属性

附:

用Apifox访问,也正常返回

AHK v1 官方示例源代码

AHK v1运行失败报错 0x80092004 找不到对象或属性

用Msxml2.XMLHTTP则能正常得到结果



背景描述

想通过ahk编程,获取 https://autohotkey.com/download/2.0/version.txt  的文件内容。

在确认用浏览器可以正常访问情况下,用官方帮助中的示例运行会报错 Error: (0x80092004) 找不到对象或属性。用 thqby大佬的 WinHttpRequest.ahk 网络请求库 https://github.com/thqby/ahk2_lib/blob/master/WinHttpRequest.ahk  也报同样错误。

求指点

 用浏览器访问,正常返回

 AHK v2官方示例源代码

whr := ComObject("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://autohotkey.com/download/2.0/version.txt", true)
whr.Send()
whr.WaitForResponse()
version := whr.ResponseText
MsgBox version

 AHK v2运行结果报错(0x80092004) 找不到对象或属性

如果把参数 true改为 false ,报错如下:

用thqby大佬的WinHttpRequest.ahk库测试报错 0x80092004 找不到对象或属性

/************************************************************************
 * @file: WinHttpRequest.ahk
 * @description: 网络请求库
 * @author thqby
 * @date 2021/08/01
 * @version 0.0.18
 ***********************************************************************/
 #Requires AutoHotkey v2.0
whr := WinHttpRequest()
whr.Open("Get", "https://www.autohotkey.com/download/2.0/version.txt", True)
whr.Send()
whr.WaitForResponse()
MsgBox whr.ResponseText


class WinHttpRequest {
	static AutoLogonPolicy := {
		Always: 0,
		OnlyIfBypassProxy: 1,
		Never: 2
	}
	static Option := {
		UserAgentString: 0,
		URL: 1,
		URLCodePage: 2,
		EscapePercentInURL: 3,
		SslErrorIgnoreFlags: 4,
		SelectCertificate: 5,
		EnableRedirects: 6,
		UrlEscapeDisable: 7,
		UrlEscapeDisableQuery: 8,
		SecureProtocols: 9,
		EnableTracing: 10,
		RevertImpersonationOverSsl: 11,
		EnableHttpsToHttpRedirects: 12,
		EnablePassportAuthentication: 13,
		MaxAutomaticRedirects: 14,
		MaxResponseHeaderSize: 15,
		MaxResponseDrainSize: 16,
		EnableHttp1_1: 17,
		EnableCertificateRevocationCheck: 18,
		RejectUserpwd: 19
	}
	static PROXYSETTING := {
		PRECONFIG: 0,
		DIRECT: 1,
		PROXY: 2
	}
	static SETCREDENTIALSFLAG := {
		SERVER: 0,
		PROXY: 1
	}
	static SecureProtocol := {
		SSL2: 0x08,
		SSL3: 0x20,
		TLS1: 0x80,
		TLS1_1: 0x200,
		TLS1_2: 0x800,
		All: 0xA8
	}
	static SslErrorFlag := {
		UnknownCA: 0x0100,
		CertWrongUsage: 0x0200,
		CertCNInvalid: 0x1000,
		CertDateInvalid: 0x2000,
		Ignore_All: 0x3300
	}

	__New(UserAgent := unset) {
		(this.whr := ComObject('WinHttp.WinHttpRequest.5.1')).Option[0] := IsSet(UserAgent) ? UserAgent : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68'
	}

	request(url, method := 'GET', post_data?, headers := {}) {
		this.Open(method, url)
		for k, v in headers.OwnProps()
			this.SetRequestHeader(k, v)
		this.Send(post_data?)
		return this.ResponseText
	}
	enableRequestEvents(Enable := true) {
		static vtable := init_vtable()
		if !Enable
			return this._ievents := this._ref := 0
		if this._ievents
			return
		IConnectionPointContainer := ComObjQuery(pwhr := ComObjValue(this.whr), '{B196B284-BAB4-101A-B69C-00AA00341D07}')
		DllCall('ole32\CLSIDFromString', 'str', '{F97F4E15-B787-4212-80D1-D380CBBF982E}', 'ptr', IID_IWinHttpRequestEvents := Buffer(16))
		ComCall(4, IConnectionPointContainer, 'ptr', IID_IWinHttpRequestEvents, 'ptr*', IConnectionPoint := ComValue(0xd, 0))	; IConnectionPointContainer->FindConnectionPoint
		IWinHttpRequestEvents := Buffer(3 * A_PtrSize)
		NumPut('ptr', vtable.Ptr, 'ptr', ObjPtr(this), 'ptr', ObjPtr(IWinHttpRequestEvents), IWinHttpRequestEvents)
		ComCall(5, IConnectionPoint, 'ptr', IWinHttpRequestEvents, 'uint*', &dwCookie := 0)	; IConnectionPoint->Advise
		this._ievents := { __Delete: (*) => ComCall(6, IConnectionPoint, 'uint', dwCookie) }
		static init_vtable() {
			vtable := Buffer(A_PtrSize * 7), offset := vtable.Ptr
			for nParam in StrSplit('3113213')
				offset := NumPut('ptr', CallbackCreate(EventHandler.Bind(A_Index), , Integer(nParam)), offset)
			vtable.DefineProp('__Delete', { call: __Delete })
			return vtable
			static EventHandler(index, this, arg1 := 0, arg2 := 0) {
				if (index < 4) {
					IEvents := NumGet(this, A_PtrSize * 2, 'ptr')
					if index == 1
						NumPut('ptr', this, arg2)
					if index == 3
						ObjRelease(IEvents)
					else ObjAddRef(IEvents)
					return 0
				}
				req := ObjFromPtrAddRef(NumGet(this, A_PtrSize, 'ptr'))
				req.readyState := index - 2
				switch index {
					case 4:	; OnResponseStart
						try req.OnResponseStart(arg1, StrGet(arg2, 'utf-16'))
					case 5:	; OnResponseDataAvailable
						try req.OnResponseDataAvailable(
							NumGet((pSafeArray := NumGet(arg1, 'ptr')) + 8 + A_PtrSize, 'ptr'),
							NumGet(pSafeArray + 8 + A_PtrSize * 2, 'uint'))
					case 6:	; OnResponseFinished
						try req._ref := 0, req.OnResponseFinished()
					case 7:	; OnError
						try req.readyState := req._ref := 0, req.OnError(arg1, StrGet(arg2, 'utf-16'))
				}
			}
			static __Delete(this) {
				loop 7
					CallbackFree(NumGet(this, (A_Index - 1) * A_PtrSize, 'ptr'))
			}
		}
	}

	;#region IWinHttpRequest https://learn.microsoft.com/en-us/windows/win32/winhttp/iwinhttprequest-interface
	SetProxy(ProxySetting, ProxyServer, BypassList) => this.whr.SetProxy(ProxySetting, ProxyServer, BypassList)
	SetCredentials(UserName, Password, Flags) => this.whr.SetCredentials(UserName, Password, Flags)
	SetRequestHeader(Header, Value) => this.whr.SetRequestHeader(Header, Value)
	GetResponseHeader(Header) => this.whr.GetResponseHeader(Header)
	GetAllResponseHeaders() => this.whr.GetAllResponseHeaders()
	Send(Body?) => (this._ievents && this._ref := this, this.whr.Send(Body?))
	Open(verb, url, async := false) {
		this.readyState := 0
		this.whr.Open(verb, url, async)
		this.readyState := 1
	}
	WaitForResponse(Timeout := -1) => this.whr.WaitForResponse(Timeout)
	Abort() => (this._ref := this.readyState := 0, this.whr.Abort())
	SetTimeouts(ResolveTimeout := 0, ConnectTimeout := 60000, SendTimeout := 30000, ReceiveTimeout := 30000) => this.whr.SetTimeouts(ResolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout)
	SetClientCertificate(ClientCertificate) => this.whr.SetClientCertificate(ClientCertificate)
	SetAutoLogonPolicy(AutoLogonPolicy) => this.whr.SetAutoLogonPolicy(AutoLogonPolicy)

	Status => this.whr.Status
	StatusText => this.whr.StatusText
	ResponseText => this.whr.ResponseText
	ResponseBody {
		get {
			pSafeArray := ComObjValue(t := this.whr.ResponseBody)
			pvData := NumGet(pSafeArray + 8 + A_PtrSize, 'ptr')
			cbElements := NumGet(pSafeArray + 8 + A_PtrSize * 2, 'uint')
			return ClipboardAll(pvData, cbElements)
		}
	}
	ResponseStream => this.whr.responseStream
	Option[Opt] {
		get => this.whr.Option[Opt]
		set => (this.whr.Option[Opt] := Value)
	}
	Headers {
		get {
			m := Map(), m.Default := ''
			loop parse this.GetAllResponseHeaders(), '`r`n'
				if (p := InStr(A_LoopField, ':'))
					m[SubStr(A_LoopField, 1, p - 1)] .= LTrim(SubStr(A_LoopField, p + 1))
			return m
		}
	}
	/**
	 * The OnError event occurs when there is a run-time error in the application.
	 * @prop {(this,errCode,errDesc)=>void} OnError
	 */
	OnError := 0
	/**
	 * The OnResponseDataAvailable event occurs when data is available from the response.
	 * @prop {(this,safeArray)=>void} OnResponseDataAvailable
	 */
	OnResponseDataAvailable := 0
	/**
	 * The OnResponseStart event occurs when the response data starts to be received.
	 * @prop {(this,status,contentType)=>void} OnResponseDataAvailable
	 */
	OnResponseStart := 0
	/**
	 * The OnResponseFinished event occurs when the response data is complete.
	 * @prop {(this)=>void} OnResponseDataAvailable
	 */
	OnResponseFinished := 0
	;#endregion

	readyState := 0, whr := 0, _ievents := 0
	static __New() {
		if this != WinHttpRequest
			return
		this.DeleteProp('__New')
		for prop in ['OnError', 'OnResponseDataAvailable', 'OnResponseStart', 'OnResponseFinished']
			this.Prototype.DefineProp(prop, { set: make_setter(prop) })
		make_setter(prop) => (this, value := 0) => value && (this.DefineProp(prop, { call: value }), this.enableRequestEvents())
	}
}

附:

用Apifox访问,也正常返回

AHK v1 官方示例源代码

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://www.autohotkey.com/download/1.1/version.txt", true)
whr.Send()
whr.WaitForResponse()
version := whr.ResponseText
MsgBox % version

AHK v1运行失败报错 0x80092004 找不到对象或属性

用Msxml2.XMLHTTP则能正常得到结果

#Requires AutoHotkey v2.0
req := ComObject("Msxml2.XMLHTTP")
req.open("GET", "https://www.autohotkey.com/download/2.0/version.txt", true)
req.onreadystatechange := Ready
req.send()

Persistent

Ready() {
    if (req.readyState != 4)  ; 没有完成.
        return
    if (req.status == 200) ; OK.
        MsgBox "Latest AutoHotkey version: " req.responseText
    else
        MsgBox "Status " req.status,, 16
    ExitApp
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样优化 PostgreSQL 中对复杂查询的并行执行计划?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样优化 PostgreSQL 中对复杂查询的并行执行计划一、了解并行执行计划的基础知识二、优化并行执行计划…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…

内衣专用洗衣机怎么样?五样超卓臻品专业推荐!

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

【Python】Selenium怎么切换浏览器的页面

我们在爬网使用Selenium进行测试的时候&#xff0c;有时候想要点击浏览器里面的网址&#xff0c;跳到另一个页面上&#xff0c;获取第二个页面的内容。 可是有时候从官网进去&#xff0c;点击跳转到下一个页面以后&#xff0c;却没法定位到下一个页面的元素&#xff0c;这时候就…

【JVM基础01】——介绍-初识JVM运行流程

目录 1- 引言&#xff1a;初识JVM1-1 JVM是什么&#xff1f;(What)1-1-1 概念1-1-2 优点 1-2 为什么学习JVM?(Why) 2- 核心&#xff1a;JVM工作的原理&#xff08;How&#xff09;⭐2-1 JVM 的组成部分及工作流程2-2 学习侧重点 3- 小结(知识点大纲)&#xff1a;3-1 JVM 组成3…

Ubuntu 22.04.4 LTS (linux) 安装certbot 免费ssl证书申请 letsencrypt

1 安装certbot sudo apt update sudo apt-get install certbot 2 申请letsencrypt证书 sudo certbot certonly --webroot -w 网站目录 -d daloradius.域名.com 3 修改nginx 配置ssl 证书 # 配置服务器证书 ssl_certificate /etc/letsencrypt/live/daloradius.域名.com/f…

FPGA:基于复旦微FMQL10S400 /FMQL20S400 国产化核心板

复旦微电子是国内集成电路设计行业的领军企业之一&#xff0c;早在2000年就在香港创业板上市&#xff0c;成为行业内首家上市公司。公司的RFID芯片、智能卡芯片、EEPROM、智能电表MCU等多种产品在市场上的占有率位居行业前列。 今天介绍的是搭载复旦微 FMQL10S400/FMQL20S400的…

16001.WSL2 ubuntu20.04 编译安装 vsomeip

文章目录 1 vsomeip 编译安装1.1 vsomeip的安装1.2 编译提示错误1.3 编译hello_world示例1.4 运行服务器端 1 vsomeip 编译安装 1.1 vsomeip的安装 参考博文 https://blog.csdn.net/peterwanye/article/details/128386539 1.2 编译提示错误 ubuntu1-BJ-EE1000042:~/opt/vso…

【持续集成_05课_Linux部署SonarQube及结合开发项目部署】

一、Linux下安装SonarQube 1、安装sonarQube 前置条件&#xff1a;sonarQube不能使用root账号进行启动&#xff0c;所以需要创建普通用户及 其用户组 1&#xff09;创建组 2&#xff09;添加用户、组名、密码 3&#xff09;CMD上传qube文件-不能传到home路径下哦 4&#xff09…

【NLP大模型】词嵌入的空间表示与应用

文章目录 一、语义特征空间二、引入新维度&#xff1a;皇室三、语义特征向量的用途四、向量运算类比五、词嵌入的维度和应用词嵌入的应用 六、测量欧几里得距离向量计算向量和欧几里得距离 七、使用点积测量相似度八、创建词嵌入 一、语义特征空间 考虑“男人”、“女人”、“…

安防监控平台LntonAIServer视频监控管理平台裸土检测算法核心优势和应用场景

LntonAIServer裸土检测算法是一种基于人工智能技术的创新解决方案&#xff0c;旨在实现对裸土地表的自动识别。以下是对该算法的详细解析&#xff1a; 一、技术原理 LntonAIServer裸土检测算法利用深度学习和计算机视觉技术&#xff0c;通过捕捉视频或图像中的关键信息&#…

记录我使用poi库,中文却无法显示的问题

目录 前言&#xff1a; 正片&#xff1a; 修改word的编码格式 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步&#xff1a; 修改idea编码格式 前言&#xff1a; &#x1f388;&#x1f388;&#x1f388;这是昨天晚上Blue遇到的…

【微服务】Spring Cloud Config解决的问题和案例

文章目录 强烈推荐引言解决问题1. 配置管理的集中化2. 配置的版本控制3. 环境特定配置4. 配置的动态刷新5. 安全管理敏感数据6. 配置的一致性 组件1. **配置服务器&#xff08;Config Server&#xff09;**2. **配置客户端&#xff08;Config Client&#xff09;** 配置示例配置…

2024年大数据高频面试题(上篇)

文章目录 HDFS读流程和写流程HDFS读数据流程NameNode和Secondary NameNode工作机制FsimageEdits文件Seen_txidnamenode工作机制HA NameNode如何工作ZKFCHealthMonitorActiveStandbyElectorJouranlNode集群DataNode工作机制DataNode数据损坏压缩MapReduce工作流程MapTask工作流R…

Git常用命令以及使用IDEA集成Gitee

目录 一、设置用户签名 二、初始化本地库 三、查看本地库状态 四、添加文件到暂存区 五、提交本地库 六、修改文件 七、版本穿梭 八、Git分支 九、分支的操作 9.1、查看分支 9.2、创建分支 9.3、切换分支 9.4、合并分支 十、团队协作 十一、Idea集成Git 11.1、配…

Vulnhub:DC-1

1.环境搭建 靶机下载地址 将下载的靶机导入到Oracle VM VirtualBox中&#xff0c;设置仅主机模式&#xff0c;使用和kali相同的网卡 2.渗透过程 使用nmap工具进行主机发现扫描 nmap -sn 192.168.56.0/24 发现靶机ip地址&#xff0c;使用nmap工具进行靶机端口扫描 nmap -sS…

Golang | Leetcode Golang题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; func productExceptSelf(nums []int) []int {length : len(nums)// L 和 R 分别表示左右两侧的乘积列表L, R, answer : make([]int, length), make([]int, length), make([]int, length)// L[i] 为索引 i 左侧所有元素的乘积// 对于索引为 …

AIGC时代算法工程师的面试秘籍(2024.6.24-7.7第十七式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法&#xff0c;力求让读者在获得心仪offer的同时&#xff0c;增强技术基本面。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky…

如何使用ECharts和DataV.GeoAtlas创建广东省人口分布图

引言 数据可视化是数据分析中的重要环节&#xff0c;它可以帮助我们直观地理解数据。ECharts 是一个由百度团队开发的开源数据可视化库&#xff0c;它提供了丰富的图表类型和灵活的配置选项。DataV.GeoAtlas 是阿里云提供的一个地理数据可视化平台&#xff0c;它可以帮助我们获…