在WinInet中使用异步方式

Delphi Https-Post 使用WinINet,IDURI,中的进行HttpsPost,用CNPack中的CnMD5, CnBase64处理 立即下载
  1. #include<WINDOWS.H>   
  2. #include<WININET.H>   
  3. #include<IOSTREAM.H>   
  4.   
  5. HANDLE hConnectedEvent, hRequestOpenedEvent, hRequestCompleteEvent;   
  6. HINTERNET hInstance, hConnect, hRequest;   
  7. char *lpszUrl, *lpszServer;   
  8.   
  9. BOOL bAllDone = FALSE;   
  10. BOOL bVerbose = FALSE;   
  11.   
  12. void __stdcall Callback(HINTERNET hInternet,   
  13.               DWORD dwContext,   
  14.               DWORD dwInternetStatus,   
  15.               LPVOID lpStatusInfo,   
  16.               DWORD dwStatusInfoLen);   
  17.   
  18. void main(int argc, char *argv[])   
  19. {   
  20.     if (argc != 3)   
  21.     {   
  22.         if ((argc == 4) && (argv[3][0] == 'v'))   
  23.             bVerbose = TRUE;   
  24.         else  
  25.         {   
  26.             cout << "Usage: asynchttp <SERVER> <URL> [v]" << endl;   
  27.             cout << "   <SERVER> is the hostname of the http server" << endl;   
  28.             cout << "   <URL> is the url of the object you are requesting (without the hostname)" << endl;   
  29.             cout << "   'v' for verbose output" << endl << endl;   
  30.             cout << "   Example: asynchttp www.domain.com /docs/readme.htm v" << endl;   
  31.             return;   
  32.         }   
  33.     }   
  34.   
  35.     lpszServer = argv[1];   
  36.     lpszUrl = argv[2];   
  37.   
  38.     hConnectedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);   
  39.     hRequestOpenedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);   
  40.     hRequestCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);   
  41.   
  42.     hInstance = InternetOpen("asynchttp",    
  43.                              INTERNET_OPEN_TYPE_PRECONFIG,   
  44.                              NULL,   
  45.                              NULL,   
  46.                              INTERNET_FLAG_ASYNC); // ASYNC Flag   
  47.   
  48.     if (hInstance == NULL)   
  49.     {   
  50.         cout << "InternetOpen failed, error " << GetLastError();   
  51.         return;   
  52.     }   
  53.   
  54.     // Setup callback function   
  55.     if (InternetSetStatusCallback(hInstance,   
  56.                                   (INTERNET_STATUS_CALLBACK)&Callback) == INTERNET_INVALID_STATUS_CALLBACK)   
  57.     {   
  58.         cout << "InternetSetStatusCallback failed, error " << GetLastError();   
  59.         return;   
  60.     }   
  61.   
  62.     // First call that will actually complete asynchronously even   
  63.     // though there is no network traffic   
  64.     hConnect = InternetConnect(hInstance,    
  65.                                lpszServer,    
  66.                                INTERNET_DEFAULT_HTTP_PORT,   
  67.                                NULL,   
  68.                                NULL,   
  69.                                INTERNET_SERVICE_HTTP,   
  70.                                0,   
  71.                                1); // Connection handle's Context   
  72.     if (hConnect == NULL)   
  73.     {   
  74.         if (GetLastError() != ERROR_IO_PENDING)   
  75.         {   
  76.             cout << "InternetConnect failed, error " << GetLastError();   
  77.             return;   
  78.         }   
  79.         // Wait until we get the connection handle   
  80.         WaitForSingleObject(hConnectedEvent, INFINITE);   
  81.     }   
  82.   
  83.   
  84.     // Open the request   
  85.     hRequest = HttpOpenRequest(hConnect,    
  86.                                "GET",    
  87.                                lpszUrl,   
  88.                                NULL,   
  89.                                NULL,   
  90.                                NULL,   
  91.                                INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,   
  92.                                2);  // Request handle's context    
  93.     if (hRequest == NULL)   
  94.     {   
  95.         if (GetLastError() != ERROR_IO_PENDING)   
  96.         {   
  97.             cout << "HttpOpenRequest failed, error " << GetLastError();   
  98.             return;   
  99.         }   
  100.         // Wait until we get the request handle   
  101.         WaitForSingleObject(hRequestOpenedEvent, INFINITE);   
  102.     }   
  103.   
  104.     if (!HttpSendRequest(hRequest,    
  105.                          NULL,    
  106.                          0,    
  107.                          NULL,   
  108.                          0))   
  109.     {   
  110.         if (GetLastError() != ERROR_IO_PENDING)   
  111.         {   
  112.             cout << "HttpSendRequest failed, error " << GetLastError();   
  113.             return;   
  114.         }   
  115.     }   
  116.        
  117.     if (bVerbose)   
  118.     {   
  119.         cout << "HttpSendRequest called successfully" << endl;   
  120.         cout.flush();   
  121.     }   
  122.   
  123.     WaitForSingleObject(hRequestCompleteEvent, INFINITE);   
  124.   
  125.     cout << "------------------- Read the response -------------------" << endl;   
  126.     char lpReadBuff[256];   
  127.   
  128.     do  
  129.     {   
  130.         INTERNET_BUFFERS InetBuff;   
  131.         FillMemory(&InetBuff, sizeof(InetBuff), 0);   
  132.         InetBuff.dwStructSize = sizeof(InetBuff);   
  133.         InetBuff.lpvBuffer = lpReadBuff;   
  134.         InetBuff.dwBufferLength = sizeof(lpReadBuff) - 1;   
  135.            
  136.         if (bVerbose)   
  137.         {   
  138.             cout << "Calling InternetReadFileEx" << endl;   
  139.             cout.flush();   
  140.         }   
  141.   
  142.         if (!InternetReadFileEx(hRequest,   
  143.                               &InetBuff,   
  144.                               0, 2))   
  145.         {   
  146.             if (GetLastError() == ERROR_IO_PENDING)   
  147.             {   
  148.                 if (bVerbose)   
  149.                 {   
  150.                     cout << "Waiting for InternetReadFileEx to complete" << endl;   
  151.                     cout.flush();   
  152.                 }   
  153.                 WaitForSingleObject(hRequestCompleteEvent, INFINITE);   
  154.             }   
  155.             else  
  156.             {   
  157.                 cout << "InternetReadFileEx failed, error " << GetLastError();   
  158.                 cout.flush();   
  159.                 return;   
  160.             }   
  161.         }   
  162.   
  163.         lpReadBuff[InetBuff.dwBufferLength] = 0;   
  164.         cout << lpReadBuff;   
  165.         cout.flush();   
  166.   
  167.         if (InetBuff.dwBufferLength == 0)    
  168.             bAllDone = TRUE;   
  169.   
  170.     } while (bAllDone == FALSE);   
  171.   
  172.     cout << endl << endl << "------------------- Request Complete ----------------" << endl;   
  173.   
  174. }   
  175.   
  176. void __stdcall Callback(HINTERNET hInternet,   
  177.               DWORD dwContext,   
  178.               DWORD dwInternetStatus,   
  179.               LPVOID lpStatusInfo,   
  180.               DWORD dwStatusInfoLen)   
  181. {   
  182.     if (bVerbose)   
  183.     {   
  184.         cout << "Callback dwInternetStatus: " << dwInternetStatus << " Context: " << dwContext << endl;   
  185.         cout.flush();   
  186.     }   
  187.   
  188.     switch(dwContext)   
  189.     {   
  190.     case 1: // Connection handle   
  191.         if (dwInternetStatus == INTERNET_STATUS_HANDLE_CREATED)   
  192.         {   
  193.             INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;   
  194.             hConnect = (HINTERNET)pRes->dwResult;   
  195.             if (bVerbose)   
  196.             {   
  197.                 cout << "Connect handle created" << endl;   
  198.                 cout.flush();   
  199.             }   
  200.             SetEvent(hConnectedEvent);   
  201.         }   
  202.         break;   
  203.     case 2: // Request handle   
  204.         switch(dwInternetStatus)   
  205.         {   
  206.         case INTERNET_STATUS_HANDLE_CREATED:   
  207.             {   
  208.                 INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;   
  209.                 hRequest = (HINTERNET)pRes->dwResult;   
  210.                 if (bVerbose)   
  211.                 {   
  212.                     cout << "Request handle created" << endl;   
  213.                     cout.flush();   
  214.                 }   
  215.                 SetEvent(hRequestOpenedEvent);   
  216.             }   
  217.             break;   
  218.         case INTERNET_STATUS_REQUEST_SENT:   
  219.             {   
  220.                 DWORD *lpBytesSent = (DWORD*)lpStatusInfo;   
  221.                 if (bVerbose)   
  222.                 {   
  223.                     cout << "Bytes Sent: " << *lpBytesSent << endl;   
  224.                     cout.flush();   
  225.                 }   
  226.             }   
  227.             break;   
  228.         case INTERNET_STATUS_REQUEST_COMPLETE:   
  229.             {   
  230.                 INTERNET_ASYNC_RESULT *pAsyncRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;   
  231.                 if (bVerbose)   
  232.                 {   
  233.                     cout << "Function call finished" << endl;   
  234.                     cout << "dwResult: " << pAsyncRes->dwResult << endl;   
  235.                     cout << "dwError:  " << pAsyncRes->dwError << endl;   
  236.                     cout.flush();   
  237.                 }   
  238.                 SetEvent(hRequestCompleteEvent);   
  239.             }   
  240.             break;   
  241.         case INTERNET_STATUS_RECEIVING_RESPONSE:   
  242.             if (bVerbose)   
  243.             {   
  244.                 cout << "Receiving Response" << endl;   
  245.                 cout.flush();   
  246.             }   
  247.             break;   
  248.         case INTERNET_STATUS_RESPONSE_RECEIVED:   
  249.             {   
  250.                 DWORD *dwBytesReceived = (DWORD*)lpStatusInfo;   
  251.                 if (*dwBytesReceived == 0)   
  252.                     bAllDone = TRUE;   
  253.                 if (bVerbose)   
  254.                 {   
  255.                     cout << "Received " << *dwBytesReceived << endl;   
  256.                     cout.flush();   
  257.                 }   
  258.             }   
  259.   
  260.         }   
  261.   
  262.     }   
  263.   
  264. }  
WinInet Http 异步封装类 WinInet Http 异步封装类 异步:避免线程安全问题。提供上传下载文件方法 立即下载

相关推荐

Day470&471.Netty概述&Netty高性能架构设计 -netty

Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO

阿昌爱Java 1572

Delphi 使用WinInet 进行下载

WinInetDownLoad('http://下载地名','c:\本地文件名') 引用 unit xHttpGetThread; interface const MAXBLOCKSIZE = 1024; function WinInetDownLoad(Url:PChar; FileName:string):Boolean; implementation uses Windo

warrially的专栏 5520

TwinCAT3新手必看:5分钟搞定EtherCAT从站PDO动态配置(附电流变量添加技巧)

本文为TwinCAT3新手提供了EtherCAT从站PDO动态配置的快速入门指南。文章详细解析了Process Data Object(PDO)在实时数据交换中的核心作用,并分步演示了在TwinCAT3工程中扫描从站、动态添加与映射PDO(包括接收PDO和发送PDO)的完整操作流程。重点分享了如何灵活添加并监控如电机实际电流等关键工艺变量的高级技巧,并针对不同品牌驱动器的兼容性问题提供了实用的调试心法和解决方案,帮助工程师快速上手并优化工业自动化系统。

xgboost6farmer的博客 454

WinInet API 的异步方式使用

作者邮箱:zhtrue@sina.com异步方式并不是什么高深莫测的事物,WinInet API 更是大家耳熟能详。如果你仔细看过 MSDN 和 internet 上关于 WinInet API 的文章,你会发现尽管在很多篇章中提到了异步方式的使用,但是大部分说明都只说可以使用,而没有说如何使用。尽管如此,还是有一些文章可以给我们很多的提示,我会在后面列出。由于网络数据传输经常会消耗一

zhtrue的专栏 1098

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2621

200smart 模拟量转换库的建立

模拟量当前值 =(工程值 - 工程量下限)*(模拟量上限 - 模拟量下限)/ (工程量上限 - 工程量下限)+ 模拟量下限2. 建立变量表3. 程序。

mmxxoo_xxmmp的博客 4219

WinInet HTTP的异步方式使用

绪论 如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推崇的。 当你决定使用该方式时,你却找不到如何使用异步的说明。网上也没有任何例子。研究了很长时间,也做了很多试验,我最终决定着手来填补一份(非官方)空缺的文档。 为什么异步方式是最好的?因为它能够正确的处理超时。而在IE5.5下WinInet缺少此功能。 如果你试图使用Termin

zhxuan30的专栏 657

基于用户的协同过滤算法(userCF)

1.定义 userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。 基于用户的协同过滤算法主要包括两个步骤: 2.第一步:找到和目标用户兴趣相似的用户集合。 利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过...

jiangdongxiaobawang的博客 1万+

Windows Mobile下WinInet的异步使用方法

codeproject上有一篇老美写的关于HTTP异步的文章:http://www.codeproject.com/KB/IP/asyncwininet.aspx。 我做HTTP异步的时候,也是参考了这篇文章,受益匪浅。今天特地翻译出来,与大家共飨。 WinInet HTTP的异步方式使用 绪论 如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推...

mmdev 118

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3185

嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估

ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环

博客 1128

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法

摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。

561

使用InternetOpenUrl挂起的一个解决方案

在某个同事留下的网络操作代码中,如果用户试图从网络打开一个实际并不存在的URL, 走到InternetOpenUrl这步,应用程序就一命呜呼了。这个API并没有按照文档上说的那样返回一个NULL给文件HANDLE,而是完全停止响应。他尝试使用InternetSetOption来设置超时的时限,代码里这样写DWORD n = 10000;InternetSetOption(p->Internet

ilikemorning的专栏 989

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

异步方式调用WinInet

转自:http://www.cppblog.com/huyutian/articles/122994.html   异步方式调用WinInet 关于WinInet的异步模式,微软给过很多例子,但我觉得下面这个是比较好理解的。 原文地址,代码贴出来,有些细节部分还要自己慢慢体会。 我在调试过程中,还参照了以下一些链接 关于GetLastError返回1201(ERROR_INTE

cuboo的专栏 1281

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WinInet

About WinInet:https://docs.microsoft.com/en-us/windows/desktop/WinInet/about-wininet https://blog.youkuaiyun.com/zhenyusoso/article/details/7956672 WinInet, WinHttp, Winsock, ws2_32的区别和联系 在Windows平台进...

RoseFang的专栏 530

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 一个计算机高手的成长——推荐一读
下一篇: 办公楼式大开间标准结构综合布线系统
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值