异步调用win32 internet functions

原创 2002年12月30日 09:23:00

前段时间在开发过程中需要访问网页,用CInternetSession很方便的实现同步访问,但用异步访问是总是弹出assert错误,极不爽快,而我的程序想实现异步访问,在网上搜寻了许久,但所述都不够详细,经鄙人一段时间的摸索,终于成功实现异步访问网页。。。特写此文,以供有需要者共享,如果需要演示代码,可以发信至silver0001@163.com ,本人无偿供应源代码。

下面简要叙述一下实现步骤:

1,用InternetOpen建立internet handle

HINTERNET hInternet=InternetOpen("MyProgram/1.0",PRE_CONFIG_INTERNET_ACCESS, 0,0,INTERNET_FLAG_ASYNC)

2, 调用InternetSetStatusCallback建立回调函数

   INTERNET_STATUS_CALLBACK pRet =
    InternetSetStatusCallback(m_hInternet, OnStatusCallback);

3,调用InternetOpenUrl函数打开一个URL

  InternetOpenUrl(hInternet,pstrURL,NULL,0,
   INTERNET_FLAG_TRANSFER_ASCII,
   (DWORD)hWnd);这里的hWnd句柄为接受回调函数发送的消息的窗口句柄

4,处理回调函数

void AFXAPI OnStatusCallback( HINTERNET hInternet,DWORD dwContext, DWORD dwInternetStatus,
         LPVOID lpvStatusInformation,
         DWORD dwStatusInformationLength )
{
// AFX_MANAGE_STATE( AfxGetAppModuleState( ) );
HWND hwnd=(HWND)dwContext
 switch(dwInternetStatus)
 {
 case INTERNET_STATUS_CONNECTION_CLOSED:
  // Successfully closed the connection to the server. The lpvStatusInformation parameter is NULL. 
  if(IsWindow(hwnd))
   PostMessage(m_hWndParent,WM_CONNECT_CLOSED,0,0);
  break;
 case INTERNET_STATUS_REQUEST_COMPLETE :
  {
  // Used by the Win32 API function InternetConnect to indicate that it has created the new handle. This lets the application call the Win32 function InternetCloseHandle from another thread if the connect is taking too long. See the ActiveX SDK for more information about these functions.
   INTERNET_ASYNC_RESULT* res = (INTERNET_ASYNC_RESULT*)lpvStatusInformation;
   HINTERNET hInet = (HINTERNET)(res->dwResult);
   if(IsWindow(hwnd))
    PostMessage(hwnd,WM_REQUEST_COMPLETE,(WPARAM)res->dwError ,(LPARAM)hInet);
  }
  break;
 default:
//  Message("Unknown status:%d",dwInternetStatus);
  break;
 }

}

5,在拥有hwnd句柄的窗口类里处理WindowProc函数,在头文件里定义类变量

HINTERNET m_hInternet

TCHAR m_buf[1024];

INTERNET_BUFFERS ip;

在CPP文件里处理WindowProc函数

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
 // TODO: Add your specialized code here and/or call the base class
 
 switch(message)
 {
 case WM_CONNECT_CLOSED:
  {
   if(ip.dwBufferLength>0)
   {
    m_buf[ip.dwBufferLength]=0;
    ib.dwBufferTotal+=ip.dwBufferLength;
//    Message(m_buf);//here storage or show m_buf;
   }
   TRACE("--Bufferlen:%d,Total:%d----/n",ib.dwBufferLength,ib.dwBufferTotal);

//////////////here close two internet handle
  }
  break;
 case WM_REQUEST_COMPLETE:
  {
   if(wParam!=0)
   {//error
    char buf[255];
    sprintf(buf,"/r/n------Error:%d--------/r/n",wParam);
    Message(buf);
   }
   else
   {
    HINTERNET hinet=(HINTERNET)lParam;
    if(hinet>(HINTERNET)2)
     m_hInternet=hinet;
    else
    {//=1, meaning last pending complete
     hinet=m_hInternet;
     TRACE("-Buffer:%d--/n",ib.dwBufferLength);
     if(ib.dwBufferLength>0)
     {
      m_buf[ib.dwBufferLength]=0;
      TRACE("---Receive Length:%d/n",ib.dwBufferLength);
      ib.dwBufferTotal+=ib.dwBufferLength;
      // show or storage m_buf

}

// clear m_buf;
     m_buf[0]=0;
    }
    ib.dwBufferLength=1;
    BOOL bOk;

     
    while(ib.dwBufferLength!=0 )
    {
   
     memset(m_buf,0,sizeof(m_buf));
     ib.lpvBuffer = m_buf;
     ib.dwBufferLength = sizeof(m_buf)-1;
     bOk = InternetReadFileEx(hinet, &ib, IRF_ASYNC, (LPARAM)this->m_hWnd );
     if(!bOk && GetLastError()==ERROR_IO_PENDING)
     {
      TRACE("---------Pending----------");
      break;
     }
     if(bOk && ib.dwBufferLength!=0)
     {
      m_buf[ib.dwBufferLength]=0;
      TRACE("---Receive Length:%d/n",ib.dwBufferLength);
      ib.dwBufferTotal+=ib.dwBufferLength;
      Message(m_buf);
      m_buf[0]=0;
     }
    }
   }
  }
  break;
 }

 return CFrameWnd::WindowProc(message, wParam, lParam);
}

5, 如果对以上步骤有不理解者,或者最后不能实现异步访问者,请与我联系,欢迎大家。


 

 

win32 磁盘文件的正常读写与异步读写

在Win32系统下文件可以支持平常的同步读写和异步读写(但在Win9X下,Win32系统不支持磁盘文件的异步读写)。本节在后面部分将会介绍文件的异步读写,最后一段内容将向大家讲解一下文件的区域加锁。 ...
  • bytxl
  • bytxl
  • 2014年12月04日 17:29
  • 1561

win32串口同步编程、异步编程(重叠IO)

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是...
  • brk1985
  • brk1985
  • 2014年06月04日 14:57
  • 1337

hiredis中异步的实现小结

一般情况下我们使用的都是hiredis的同步通信机制,这种机制下每当你向服务器发送命令请求,程序都会阻塞直到收到服务器的回复并处理。而如果采用异步通信,程序就不需要阻塞等待服务器的回复,而是直接继续执...
  • l1902090
  • l1902090
  • 2014年08月15日 13:14
  • 7498

串口基础类库(WIN32)异步通信 _COM_H 源代码

http://www.cnblogs.com/because/archive/2012/06/14/2549809.html   串口基础类库(WIN32)异步通信 _COM_H 源代码   ...
  • sunjianjun1981
  • sunjianjun1981
  • 2014年02月12日 16:32
  • 1066

win32串口同步、异步编程

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是...
  • tianshi_1988
  • tianshi_1988
  • 2015年08月13日 13:36
  • 176

使用Win32API实现Windows下异步串口通讯、

一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。 在重叠执行...
  • hubinbin595959
  • hubinbin595959
  • 2015年10月30日 13:50
  • 467

使用Win32API实现Windows下异步串口通讯

  使用Win32API实现Windows下异步串口通讯(上.下) 收藏目录: 1. 异步非阻塞串口通讯的优点 2. 异步非阻塞串口通讯的基本原理 3. 异步非阻塞串...
  • wu_jing_sheng0
  • wu_jing_sheng0
  • 2011年05月10日 08:23
  • 262

win32 磁盘文件的正常读写与异步读写

在Win32系统下文件可以支持平常的同步读写和异步读写(但在Win9X下,Win32系统不支持磁盘文件的异步读写)。本节在后面部分将会介绍文件的异步读写,最后一段内容将向大家讲解一下文件的区域加锁。 ...
  • shadow20080578
  • shadow20080578
  • 2017年02月20日 14:58
  • 156

win32串口同步、异步编程

http://blog.csdn.net/niewq/article/details/5518933 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。...
  • mituan1234567
  • mituan1234567
  • 2013年11月22日 22:35
  • 619

使用Win32API实现Windows下异步串口通讯zz

使用Win32API实现Windows下异步串口通讯zz                                        目录: 1. 异步非阻塞串口通讯的优点 2. 异...
  • xl19900502
  • xl19900502
  • 2015年10月22日 19:16
  • 512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异步调用win32 internet functions
举报原因:
原因补充:

(最多只允许输入30个字)