win32汇编环境,网络编程入门之十四

;win32汇编环境,网络编程入门之十四
;在这一教程里,学习一下,如何得到网页的标题
;这里需要理解一下html语言,<title> </title>标签对里面的内容即为网页的标题
;其原理是把返回的字符串,按字节进行检查,发现上面的标签对时,把里面的内容提取出来.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
include    wininet.inc    ;需要添加的wininet头文件

includelib user32.lib 
includelib kernel32.lib 
includelib wininet.lib    ;需要添加的wininet库文件

; 自定义函数声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MAINDIALOG    equ 1
ICO_MAIN    equ 1000    ;图标

ID_BUTTON01    equ 41
ID_EDIT01    equ 11
ID_EDIT02    equ 12
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data 

szMsg          db "提示",0
szErr          db "错误",0

szEnter        db 13,10,0                              ;回车换行符

szAgent        db "Microsoft Internet Explorer",0      ;骗网站说自已是IE浏览器
szHostName     db "www.kepai2023.cn",0                 ;要访问的主机域名
szUrlPath      db "/A/A01.html",0                      ;要访问的页面
szVerb         db "GET",0                              ;GET方法访问
szAccept       db "Accept: text/html",0                ;只接受text或html文件返回
               
.data? 
hInstance HINSTANCE          ? 
hEdithwnd01     HWND         ?
hEdithwnd02     HWND         ?

hInternet       dd           ?
hHttpSession    dd           ?
hHttpRequest    dd           ?

.const 

  
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start: 
         invoke GetModuleHandle, NULL 
         mov    hInstance,eax 
         invoke DialogBoxParam, hInstance, MAINDIALOG,NULL, addr DlgProc, NULL 
         invoke ExitProcess,eax 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;处理接收到的字符串,网页标题提取出来
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_HandleData    proc    _lpData,_dwSize

                LOCAL   hSign    ;用来当记号,当发现标题标签对出现时,即<title> </title>时, <ti 字符时定为1,当 </t 字符时定为2,没有情况时为0
                LOCAL   szBuffer[256]:byte
                LOCAL   szSaveBuffer[256]:byte
                LOCAL   @stCR:CHARRANGE
                
                mov    esi,_lpData
        mov hSign,0

        invoke    RtlZeroMemory,addr szBuffer,sizeof szBuffer
        invoke    RtlZeroMemory,addr szSaveBuffer,sizeof szSaveBuffer
        ;invoke  SendMessage,hEdithwnd02,WM_SETTEXT,0,0               ;清空编辑框
        mov ebx,0
        mov edx,0
        ;循环检查字符串,当发现有3个连续的字符,即 <ti 则记下字符在缓冲的开始位置,当发现 </t 时则记下字符在缓冲的结束位置,把里面的内容复制下来就是网页的标题
        .while TRUE
            .break .if ebx == _dwSize
            .if byte ptr [esi+ebx] == "<" && byte ptr [esi+ebx+1] == "t" && byte ptr [esi+ebx+2] == "i"
                  mov hSign,1    
            .endif
            .if byte ptr [esi+ebx] == "<" && byte ptr [esi+ebx+1] == "/" && byte ptr [esi+ebx+2] == "t"
                  mov hSign,2
                  mov byte ptr [szBuffer+edx-7],0     ;-7 的原因是后面复制的时候,把传入进来的字符串的后7个字符复制进来了,这个时候结束复制,则需要把多余的7个字节内容去掉
            .endif
            .if hSign == 1
                mov al,byte ptr [esi+ebx+7]       ;+7 的原因是在 <title> 这7个字符之后开始复制内容                                  
                mov byte ptr [szBuffer+edx],al
                inc edx
            .endif    
            .if hSign == 2
                ;invoke GetWindowTextLength,hEdithwnd01            
                            ;mov @stCR.cpMin,eax
                    ;mov @stCR.cpMax,eax
                invoke MultiByteToWideChar,65001,0,addr szBuffer,256,addr szSaveBuffer,256       ;把uft-8编码的网页字符串转换为UNICODE编码输出
                ;invoke SendMessageW,hEdithwnd02,EM_EXSETSEL,0,addr @stCR
                            ;invoke SendMessageW,hEdithwnd02,EM_REPLACESEL,FALSE,addr szSaveBuffer

                            ;invoke SendMessage,hEdithwnd02,EM_REPLACESEL,FALSE,addr szEnter                 ;加上回车换行符
                            invoke SendMessageW,hEdithwnd02,WM_SETTEXT,0,addr szSaveBuffer
                            ;invoke MessageBox,NULL,addr szBuffer,addr szMsg,MB_OK
                mov hSign,0
                mov edx,0    
            .endif
            inc ebx
        .endw
        ret

_HandleData    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WorkThread    proc    _lParam
        LOCAL  @dwBytesReaded
        LOCAL  @szBuffer[256]:byte
        LOCAL  @szRecBuffer[1024]:byte
        LOCAL  @szSaveBuffer[1024]:byte
        LOCAL  @szShowEdit02[256]:byte
        LOCAL  @stCR:CHARRANGE
        
        LOCAL  @szContentLength[128]:byte
        LOCAL  @szStatusCode[128]:byte
        LOCAL  @Totallength
        
        invoke InternetOpen,addr szAgent,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0                                  ;初始化应用程序的 WinINet 函数的使用
        mov hInternet,eax

        invoke InternetConnect,hInternet,addr szHostName,80,NULL,NULL,INTERNET_SERVICE_HTTP,0,0                 ;为给定站点打开文件传输协议(FTP)或 HTTP 会话,80是http的端口
        mov hHttpSession,eax
        .if eax == NULL
               invoke MessageBox,NULL,addr szErr,addr szMsg,MB_OK            
        .endif

        invoke HttpOpenRequest,hHttpSession,addr szVerb,addr szUrlPath,NULL,addr szAccept,0,0,0                  ;创建 HTTP 请求句柄
        mov hHttpRequest,eax
        
        invoke HttpSendRequest,hHttpRequest,NULL,0,NULL,0                                                        ;将指定的请求发送到 HTTP 服务器,可以附加数据,后面再说,先实现基本效果先
        ;mov @Totallength,128                                                                                     ;注意这里要先赋值为缓冲区的字节大小,不能使用sizeof前面缓冲区的大小,因为它还要保存其它的值
        ;invoke HttpQueryInfo,hHttpRequest,HTTP_QUERY_STATUS_CODE,addr @szContentLength,addr @Totallength,NULL    ;HttpQueryInfo 函数需要在HttpSendRequest函数调用成功之后使用,HTTP_QUERY_STATUS_CODE值为测试HTTP连接的返回状态码

        ;invoke wsprintf,addr @szShowEdit02,addr szFrm,addr @szContentLength
        ;invoke SendMessage,hEdithwnd02,WM_SETTEXT,0,addr @szShowEdit02
        
    invoke SendMessage,hEdithwnd01,WM_SETTEXT,0,0
    .while TRUE  ;通过循环反复读取,直到读到0字节为止
            invoke RtlZeroMemory,addr @szRecBuffer,sizeof @szRecBuffer
            invoke RtlZeroMemory,addr @szSaveBuffer,sizeof @szSaveBuffer
            mov @dwBytesReaded,0
            invoke InternetReadFile,hHttpRequest,addr @szRecBuffer,1024,addr @dwBytesReaded                  ;从打开的句柄读取数据,
        .break .if @dwBytesReaded == 0
        invoke _HandleData,addr @szRecBuffer,1024                                                        ;调用得到网页标题内容的函数
        invoke MultiByteToWideChar,65001,0,addr @szRecBuffer,1024,addr @szSaveBuffer,1024                ;将UTF8编码数据转为UNICODE编码
        invoke GetWindowTextLength,hEdithwnd01                                                           ;从后面添加内容,防止覆盖上去
                mov @stCR.cpMin,eax
        mov @stCR.cpMax,eax
        invoke SendMessageW,hEdithwnd01,EM_EXSETSEL,0,addr @stCR
                invoke SendMessageW,hEdithwnd01,EM_REPLACESEL,FALSE,addr @szSaveBuffer            
    .endw

    ret

_WorkThread endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL    @stWsa:WSADATA        
        
        .if     uMsg == WM_INITDIALOG 
                invoke    LoadIcon,hInstance,ICO_MAIN           
            invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                
                invoke GetDlgItem,hWnd,ID_EDIT01
                mov hEdithwnd01,eax
                invoke GetDlgItem,hWnd,ID_EDIT02
                mov hEdithwnd02,eax
                
        .elseif    uMsg ==    WM_COMMAND
            mov    ebx,wParam
                .if    bx ==    ID_BUTTON01
                        invoke    CreateThread,NULL,0,offset _WorkThread,0,NULL,0          ;启动连接线程,用线程的原因是不让网络等待卡住主进程                         
            .endif        
        .elseif uMsg == WM_CLOSE   
                invoke InternetCloseHandle,hHttpRequest                                          ;反向清除各类HINTERNET 句柄,即先生成的后清除,后生成的先清除
                invoke InternetCloseHandle,hHttpSession                                                         
                invoke InternetCloseHandle,hInternet
        invoke EndDialog,hWnd,NULL
        .else 
                mov eax,FALSE 
                ret 
        .endif 
                mov eax,TRUE 
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"                   //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define       MAINDIALOG      1
#define       ICO_MAIN        1000    //图标
#define    ID_BUTTON01     41

#define    ID_EDIT01       11         //编辑框标识符
#define    ID_EDIT02       12
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MAINDIALOG DIALOG 10, 10, 180, 250 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | 
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版" 
FONT 11, "方正姚体"
BEGIN 
     PUSHBUTTON      "访问网页", ID_BUTTON01,  120,20,50,12
     CONTROL "显示搜索结果",ID_EDIT01,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL,10, 50, 160, 190,WS_EX_CLIENTEDGE  //设置成多行编辑框,按回车时加回车符
     CONTROL "显示网页标题",ID_EDIT02,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL,10, 10, 100, 30,WS_EX_CLIENTEDGE
END 


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)

目录 问题描述问题排查问题解决参考资料 问题描述 业主单位服务器自8月29日晚上21:00起CPU突然飙高至98%&#xff0c;内存爆满&#xff0c;一直到9月5日&#xff1a; 问题排查 ①执行 top 命令查看Java进程PID top②执行top -Hp PID 命令查看具体的线程情况 top -Hp 3058输入上…

UI产品经理基础(六):如何解决用户的质疑?

在需求调查中遇到用户质疑“不专业”或“不了解需求”&#xff0c;本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑&#xff0c;需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入&#xff0c;结合具体场景采取针对性策略。以下是系统化的解决方…

小型水库大坝安全及水雨情监测技术方案

一、小型水库监测系统构成 小型水库雨水情测报和大坝安全监测系统由水库监测站点、通信网络和监测平台等组成&#xff0c;系统总体架构如图所示。 水库监测站点设施包括&#xff1a;雨量计、水位计、视频监视设备、渗压计、量水堰计、变形监测仪器、数据采集仪、遥测终端、水准…

win11+ubuntu双系统安装

操作步骤&#xff1a; 官网下载ubuntu 最新镜像文件 准备U盘 准备一个容量不小于 8GB 的 U 盘&#xff0c;用于制作系统安装盘。制作过程会格式化 U 盘&#xff0c;请注意提前备份数据。 制作U盘启动盘 使用rufus工具&#xff0c;或者 balenaEtcher工具&#xff08;官网安…

搭建前端环境和后端环境

搭建前端环境 ①、安装vscode&#xff0c;并安装相应的插件工具 ②、安装node.js&#xff0c;可以选择当前版本&#xff0c;或者其他版本 ③、创建工作区 创建一个空文件夹&#xff0c;然后通过vscode工具打开&#xff0c;保存为后缀名为.code-workspace ④、从gitee…

I.MX6ULL 开发板上挂载NTFS格式 U 盘

I.MX6ULL 开发板上挂载NTFS格式 U 盘 挂载失败安装NTFS-3G安装失败成功安装 移植挂载成功卸载U盘 挂载失败 我使用的U盘的格式是NTFS格式的 插入U盘时会有信息 我使用的是闪迪的U盘&#xff0c;大小标称是 32G &#xff0c;实际能用的只有 28G 左右 可以使用lsblk命令查看磁盘…

K. Dice Game(ICPC)

备赛ICPC时&#xff0c;我是没想到还有数学题&#xff0c;高数都快忘完了......... 题目链接&#xff1a;Problem - K - Codeforces 我们对于某一个抽到的值x&#xff0c;其他n个人中的某一个人赢我们的概率是&#xff1a; (m-x)/m(m-x)/m^2(m-x)/m^3....(m-x)/m^K&#xff0…

加油站小程序实战教程02宫格导航

目录 引言1 应用创建2 搭建页面布局3 大模型生成图标最终效果 引言 在《加油站小程序实战教程01》中我们详细介绍了站点基本信息数据维护功能的搭建。有了数据之后就需要考虑小程序展示部分该如何搭建&#xff0c;本篇我们介绍一下应用的创建、页面布局以及数据绑定的过程。 …

如何用 Postman 进行高效的 Mock 测试?

Postman 是一个强大的 API 开发和测试工具&#xff0c;它可以让你轻松地创建和发送各种 HTTP 请求&#xff0c;查看响应结果&#xff0c;并进行调试和优化。但是有时候&#xff0c;你可能还没有开发好后端服务&#xff0c;或者想要模拟不同的响应场景&#xff0c;这时候就可以使…

2025AWE观察:“无AI不家电”,但“AI”还是“AL”仍是个问题

文 | 智能相对论 作者 | 佘凯文 3月23日&#xff0c;2025中国家电及消费电子博览会&#xff08;AWE&#xff09;在上海完美闭幕。 这场以“AI科技、AI生活”为主题的展会&#xff0c;俨然成为家电行业向智能化跃迁的缩影。从冰箱、空调到扫地机器人&#xff0c;从全屋智能到…

【赵渝强老师】Oracle数据库的客户端工具

安装并成功创建Oracle数据库后&#xff0c;便可以使用客户端工具来连接Oracle数据库。Oracle官方提供的客户端工具有&#xff1a;SQL*Plus、Oracle Enterprise Manager Database Express和SQL Developer。 一、 【实战】使用命令行工具SQL*Plus 在Oracle数据库系统中&#xf…

8.3MW屋顶光伏+光储协同:上海汽车变速器低碳工厂的能源革命-安科瑞黄安南

摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发展要求。 随着“双碳”…

【蓝桥杯每日一题】3.28

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今天熬的夜&#xff0c;会变成明天奖状的闪光点&#xff01;" 目录 一、唯一的雪花 题目链接 题目描述 解题思路 解题代码 二、逛画展 题目链接 题目描述 解题思路 解题代…

WPS JS宏编程教程(从基础到进阶)--第二部分:WPS对象模型与核心操作

第二部分&#xff1a;WPS对象模型与核心操作 WPS对象的属性、方法、集合 工作簿对象常用表达方式工作表对象常用表达方式单元格对象常用表达方式 单元格操作实战 单元格复制与重定位单元格偏移与尺寸调整 颜色设置专题 索引颜色与RGB颜色按条件动态设置单元格颜色 第二部分&…

【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】

目录 一、ICL的优势 1.传统做法 2.ICL做法 二、ICL的发展 三、ICL成因的两种看法 1.meta learning 2.Bayesian Inference 四、ICL要点 ① 语言模型的规模 ② 提示词prompt中提供的examples数量和顺序 ③ 提示词prompt的形式&#xff08;format&#xff09; 五、fine-tune VS I…

基于Spring AI开发本地Jenkins MCP Server服务

前言 首先介绍下MCP是什么&#xff1f; MCP是由开发了 Claude 模型的 Anthropic 公司2024年12月提出并开源的一项开放标准&#xff0c;全称&#xff1a;Model Context Protocol&#xff0c;它是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…

94二叉树中序遍历解题记录

怎么说呢&#xff0c;以为这道题不用记录了&#xff0c;菜得吓到了自己。起因是这个遍历的递归一般是写两个函数完成&#xff0c;如下&#xff1a; func inorder(root *TreeNode, res *[]int) {if root nil {return}inorder(root.Left, res)*res append(*res, root.Val) // …

重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!

重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案&#xff01; 稳联技术Profinet转CANopen网关应运而生——它如同一座智能桥梁☺&#xff0c;打通两大主流工业协议&#xff0c;让异构网络无缝互联&#xff0c;助您释放设备潜力&#xff0c;实现真正的“万物互联”&…

Python正则表达式(一)

目录 一、正则表达式的基本概念 1、基本概念 2、正则表达式的特殊字符 二、范围符号和量词 1、范围符号 2、匹配汉字 3、量词 三、正则表达式函数 1、使用正则表达式&#xff1a; 2、re.match()函数 3、re.search()函数 4、findall()函数 5、re.finditer()函数 6…

ArayTS:一个功能强大的 TypeScript 工具库

目录 ArayTS&#xff1a;一个功能强大的 TypeScript 工具库&#x1f680; 主要特性1. 数据结构与算法2. 实用工具函数3. 类型工具4. 数据验证5. 字符串处理6. 数组处理7. 对象处理8. 样式处理9. 随机数生成10. 文件处理 &#x1f4a1;&#x1f4a1;&#x1f4a1;除此之外&#…