Microsoft 已经介绍了Microsoft Win32网络函数来协助开发者把网络变成他们的应用程序的整体部分。这些新的功能简化了使用FTP(文件传输协议)、和HTTP(超文本传输协议)访问网络。使用Win32网络函数的开发者不需要对TCP/IP或Windows 配件。

1.InternetOpen

InternetOpen初始化WININET.DLL。它在其他的Win32网络函数之前被调用。

HINTERNET hNet = ::InternetOpen(
          "MSDN SurfBear",                                      // 1 LPCTSTR lpszCallerName
          PRE_CONFIG_INTERNET_ACCESS,   // 2 DWORD dwAccessType
          "",                                                                  // 3 LPCTSTR lpszProxyName
          INTERNET_INVALID_PORT_NUMBER, // 4 INTERNET_PORT nProxyPort
          0                                                                    // 5 DWORD dwFlags
) ;
       InternetOpen返回一个类型为HINTERNET的句柄。其他的Win32网络函数把这个句柄当作一个参数。

InternetOpen 的第一个参数lpszCallerName指定正在使用网络函数的应用程序。当HTTP协议使用时,这个名字将变成用户代理。

第二个参数dwAccessType指定访问类型。在上面的例子里,PRE_CONFIG_INTERNET_ACCESS访问类型指示Win32网络函数使用登记信息去发现一个服务器。使用PRE_CONFIG_INTERNET_ACCESS需要正确设定登记信息。这里我耍了一个小花招并让网络开发者替我登记注册。

在登记注册中,把AccessType设置为1,则意味着“直接入网”,把AccessType 设置为2,意味着“使用网关”。把DisableServiceLocation设置为1,将让它使用一个已经命名的服务器;否则将找到一个使用注册信息和名字决议(RNR)应用程序接口的服务器,它是Windows接口的一部分。

其他的访问类型包括以下几种:

LOCAL_INTERNET_ACCESS只连接到当地Internet网站。例如,如果我使用SurfBear标志,我就只能访问Microsoft整体的Internet网站。
CERN_PROXY_INTERNET_ACCESS使用一个CERN代理去访问web。CERN代理是一个充当网关的web服务器并且能向要使用代理的服务器发送HTTP请求。
GATEWAY_INTERNET_ACCESS允许连接到World Wide Web。我可以用这个访问类型去访问web上的任何站点。 
GATEWAY_PROXY_INTERNET_ACCESS和CERN_PROXY_ACCESS访问类型要求第三个参数给InternetOpen:服务器名(lpszProxyName)。PRE_CONFIG_INTERNET_ACCESS不要求服务器名,因为他可以为服务器搜索寄存信息。

NProxyPort参数用在CERN_PROXY_INTERNET_ACCESS中用来指定使用的端口数。使用INTERNET_INVALID_PORT_NUMBER相当于提供却省的端口数。

最后一个参数棗dwFlags,设置额外的选择。你可以使用 INTERNET_FLAG_ASYNC标志去指示使用返回句句柄的将来的Internet函数将为回调函数发送状态信息,使用InternetSetStatusCallback进行此项设置。

如:m_hSession    = InternetOpen(L"Http-connect", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);

2.InternetOpenUrl

一旦你把Win32网络函数初始化了,你就可以使用其他网络函数。下一个要调用的Internet 函数是InternetOpenUrl。这个函数连接到一个网络服务器上并且最被从服务器上读取数据。InternetOpenUrl能对FTP,Gopher或HTTP协议起作用。在这篇文章中,我们只涉及HTTP协议。

HINTERNET hUrlFile = ::InternetOpenUrl(
          hNet,                                        // 1 HINTERNET hInternetSession
          " Microsoft - 云、计算机、应用和游戏 ", // 2 LPCTSTR lpszUrl
          NULL,                                      // 3 LPCTSTR lpszHeaders
          0,                                              // 4 DWORD dwHeadersLength
          INTERNET_FLAG_RELOAD,       // 5 DWORD dwFlags
          0                                              // 6 DWORD dwContext
) ;
InternetOpenUrl也返回一个HINTERNET,它被传递给在这个URL(统一资源定位)上操作的函数。你应该使用InternetClose来关闭这个句柄的处理。

InternetOpenUrl的第一个参数hInternetSession是从InternetOpen返回的句柄。第二个参数lpszUrl是我们需要的资源的URL(统一资源定位)。在上面的例子中,我们想得到一个Microsoft的web主页。下面两个参数lpszHeaders和HeaderLength用来向服务器传送额外的信息。使用这些参数要求具有正在使用的特定协议的知识。

DwFlag是一个可以用几种方式修改InternetOpenUrl行为的标志,InternetOpenUrl的行为包括关闭、隐藏,使原始数据可用和用存在的连接取代开辟一个新的连接。

最后一个参数dwContext是一个 DWORD上下文值。如果有一个值已经被指定,它将被送到状态回调函数。如果这个值是0,信息将不会被送到状态回调函数。

3.InternetReadFile

你打开一个文件后,就要读它,所以下一个函数是InternetReadFile是符合逻辑的:

char buffer[10*1024] ;
DWORD dwBytesRead = 0;
BOOL bRead = ::InternetReadFile(
     hUrlFile,                     // 1 HINTERNET hFile
     buffer,                        // 2 LPVOID lpBuffer
     sizeof(buffer),           // 3 DWORD dwNumberOfBytesToRead
     &dwBytesRead        // 4 LPDWORD lpdwNumberOfBytesRead
);

buffer[dwBytesRead] = 0 ;
pEditCtrl->SetWindowText(buffer) ;
InternetReadFile接收InternetOpenUrl返回的句柄。它也对其他Win32网络函数,例如FtpOpenFile,FopherOpenFile和HttpOpenRequest返回的句柄有影响。

剩下的InternetReadFile的三个参数也非常的明白直接。Inbuffer是指向保留数据的缓冲区的一个无返回值指针,dwNumberOfByteToRead以字节为单位指定缓冲区的尺寸。最后一个参数,lpdwNumberOfBytesRead是一个指向包含读入缓冲区字节数的变量的指针。如果返回值是TRUE,而且lpdwNumberOfBytesRead指向0,则文件已经读到了文件的末尾。这个行为与Win32 Re3adFile的函数的行为是一致的。一个真正的web浏览器将在InternetReadFile上循环 ,不停地从Internet上读入数据块。

如:

char szBuffer[READ_BUFFER_SIZE + 1] = { 0 };
        DWORD dwReadSize = READ_BUFFER_SIZE;
        while( true )
        {
            bRet = InternetReadFile(m_hRequest, szBuffer, READ_BUFFER_SIZE, &dwReadSize);
            if (!bRet || (0 == dwReadSize))
                break;
            szBuffer[dwReadSize] = '\0';
            strRet.append(szBuffer, dwReadSize);
        }

4.InternetWriteFile:
将数据写到一个已经打开的Internet文件。当应用程序正在发送数据的时候,必须调用InternetCloseHandle结束文件的传输。 可以参考InternetReadFile

5.InternetCloseHandle:
关闭一个单一的Internet句柄。每调用一个InternetOpen、InternetOpenUrl、InternetConnect、HttpOpenRequest函数都需要调用InternetCloseHandle进行关闭,释放资源。

HTTP函数

在一些例子中,InternetOpenUrl太普通了,所以你可能需要其他的Win32网络函数。InternetOpenUrl相当与不同的FTP,GOPHER和HTTP函数的封皮。当使用HTTP时,InternetOpenUrl调用InternetConnect,HttpOpenRequest以及HttpSendRequest,比如说我们想要在下载一个HTML页之前得到它的尺寸以便于我们在缓冲区中为其分配适当的尺寸,HttpQueryInfo将得到web页的大小。

意思就是如果是使用http协议,可以用InternetConnect,HttpOpenRequest以及HttpSendRequest替换InternetOpenUrl。

InternetConnect

InternetConnet函数连接到一个HTTP,FTP或Gopher服务器:
HINTERNET hConnect = ::InternetConnect(
          hSession,                                                      //1 HINTERNET hInternetSession
          " Microsoft - 云、计算机、应用和游戏 ",                       //2 LPCTSTR lpszServerName
          INTERNET_INVALID_PORT_NUMBER, //3 INTERNET_PORT nServerPort
          "",                                                                   //4 LPCTSTR lpszUsername
          "",                                                                   //5 LPCTSTR lpszPassword
          INTERNET_SERVICE_HTTP,                   //6 DWORD dwService
          0,                                                                    //7 DWORD dwFlags
          O                                                                    //8 DWORD dwContext
) ;
    第六个参数dwService决定服务类型(HTTP,FTP或Gopher)。在上面的例子中,InternetConnect连接到一个HTTP服务器上,因为dwService被设置成INTERNET_SERVICE_HTTP。第二个参数(设置成 Microsoft - 云、计算机、应用和游戏 )提供了服务器的地址。注意,HTTP地址必须为服务器名作语法分析,InternetOpenUrl为我们作语法分析。第一个参数hInternetSession是从InternetOpen返回的句柄。第四个、第五个参数提供一个用户姓名和密码 。这七个参数没有控制任何标志影响HTTP操作。最后一个参数为状态回调函数提供前后关系的信息。

如:m_hConnect = InternetConnectA(m_hSession, strHostName.c_str(), port, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);

HttpOpenRequest

一旦和服务器的连接已经建立,我们打开了想要的文件。HttpOpenRequest和HttpSenRequest一起工作打开文件。HttpOpenRequest去创建一个请求句柄并且把参数存储在句柄中。HttpOpenRequest把请求参数送到HTTP服务器。
HINTERNET hHttpFile = ::HttpOpenRequest(
          hConnect,                            // 1 HINTERNET hHttpSession
          "GET",                                 // 2 LPCTSTR lpszVerb
          "/MSDN/MSDNINFO/",     // 3 LPCTSTR lpszObjectName
          HTTP_VERSION,              // 4 LPCTSTR lpszVersion
          NULL,                                  // 5 LPCTSTR lpszReferer
          0,                                          // 6 LPCTSTR FAR * lplpszAcceptTypes
          INTERNET_FLAG_DONT_CACHE, // 7 DWORD dwFlags
          0                                           // 8 DWORD dwContext
) ;
    到现在为止,网络函数的许多参数看起来都类似。HttpOpenResult的第一个参数是由InternetConnet返回的    HINTERNET。HttpOpenRequest的第七和第八个参数执行与InternetConnect中有相同名字的参数一样的功能。
    第二个参数(“GET”)指定我们想要得到由第三个参数(“/MSDN/MSDNINFO/”)命名的对象。HTTP版已经传递第四个参数;现在,它肯定是HTTP棗VERSION。因为“GET”是最流行的动词类型,HttpOpenRequest将为这个参数接收一个空指针。
    第五个参数lpszReferer是一个网点的地址。在这个网点上我们发现了我们现在想要看见的URL(统一资源定位)。换而言之,如果你在 Home.com 上而且单击了跳到 Microsoft - 云、计算机、应用和游戏 的一个连接,第五个参数就是 Home.com 。因为它使你指向了目标URL(统一资源定位)。这个值可以为空。第六个参数执行一个我们的程序接收的文件类型列表。把空值传递给HttpOpenRequest即通知了服务器只有文本文件可以被接收。

m_hRequest = HttpOpenRequestA(m_hConnect, (type == HttpGet) ? "GET" : "POST", strPageName.c_str(), "HTTP/1.1", NULL, NULL, dwFlags, NULL);

//理解:这个就是处理请求行

HttpSendRequest

该函数用于发送HTTP请求到指定的服务器。TRUE表示成功。 FALSE表示失败。 可调用GetLastError函数,得到错误信息。

BOOL WINAPI HttpSendRequest(

     HINTERNET hRequest, 

     LPCTSTR lpszHeaders, 

     DWORD dwHeadersLength, 

     LPVOID lpOptional, 

     DWORD dwOptionalLength

 );

描述

hRequest

[]打开HTTP请求返回的句柄。

lpszHeaders

[]长指针以null结尾的字符串,包含额外的头被追加到请求。 此参数可以为NULL,如果没有额外的头追加。 请参阅备注

dwHeadersLength

[in]指定的长度,字符,额外的标头。 如果这个参数是-1L和lpszHeaders不为NULL,则该函数假定的lpszHeaders零结尾(ASCIIZ),计算长度。 请参阅备注

lpOptional

[]任何可选的数据发送后,立即请求头指针。 该参数通常用于POST和PUT操作。 可选的数据可以被发送到服务器的资源或信息。 如果没有可选的数据发送,此参数可以为NULL。

dwOptionalLength

[in]指定选购的数据的长度,以字节为单位。 如果没有可选的数据要发送时,这个参数可以是零。

DWORD dwHeaderSize = (NULL == lpHeader) ? 0 : strlen(lpHeader);
DWORD dwSize = (lpPostData == NULL) ? 0 : strlen(lpPostData);

bRet = HttpSendRequestA(m_hRequest, lpHeader, dwHeaderSize, (LPVOID)lpPostData, dwSize);

//其中,在这里lpHeader 和lpPostData 可以为null

HttpQueryInfo

为了得到关于文件的信息,在调用HttpSendRequest后使用HttpQueryInfo函数:

BOOL bQuery = ::HttpQueryInfo(
     hHttpFile,                                                     // 1 HINTERNET hHttpRequest
     HTTP_QUERY_CONTENT_LENGTH,    // 2 DWORD dwInfoLevel
     bufQuery,                                                      // 3 LPVOID lpvBuffer
     &dwLengthBufQuery                                   // 4 LPDWORD lpdwBufferLength
) ;
查询的结构是字符串或lpvBuffer中的字符串列表。HTTP_QUERY_CONTENT_LENGTH查询得到文件的长度。你可以使用HttpQueryInfo查询大范围的信息。

如:HttpQueryInfo(m_hRequest, HTTP_QUERY_STATUS_CODE, szBuffer, &dwBufferSize, NULL)

HttpAddRequestHeadersA

BOOLAPI HttpAddRequestHeadersA(
    _In_ HINTERNET hRequest,
    _When_(dwHeadersLength == (DWORD)-1, _In_z_)
    _When_(dwHeadersLength != (DWORD)-1, _In_reads_(dwHeadersLength))
    LPCSTR lpszHeaders,
    _In_ DWORD dwHeadersLength,
    _In_ DWORD dwModifiers
    );

个人理解是处理请求头、实体头

lpszHeaders为外发的header.   
// 注意,这里的头部很容易错.   
// 每个字符串结尾不能带诸如 "/r/n","\r\n"这样的结尾,最后一个字符串必须要带两个"\r\n",也就是"\r\n\r\n".   
// 有些网友写的示例中,每个字符串后都带有诸如 "/r/n"或"\r\n"这样的结尾,但在我的测试中发现是错误的,   
// HttpQueryInfo返回的状态码总是400,意思是"错误请求 — 请求中有语法问题,或不能满足请求",估计这跟   
// 具体的web服务有关.但有个简单的方式处理该问题,可使用chrome浏览器访问某个url(这里是http://192.168.8.72:8080/oss/client/// analysis.g),然后使用抓包工具Wireshark抓取http包,分析request和response头.然后再使用你的程序请求你的url,一样抓包,然后对// 比这两次抓取的数据包中http头有什么区别,修改你的代码,不断尝试,直到成功.   
TCHAR headerLanguage[] = _T("Accept-Language: zh-CN,zh;q=0.8");   
TCHAR headerEncoding[] = _T("Accept-Encoding: gzip,deflate,sdch";);   
TCHAR headerCharset[] = _T("Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3");   
TCHAR headerContentType[] = _T("Content-Type: text/xml";);   
TCHAR headerHost[] = _T("Host: 192.168.8.72:8080";);   
TCHAR headerOrigin[] = _T("Origin: http://192.168.8.72:8080";);   
TCHAR headerReferer[] = _T("Referer: http://192.168.8.72:8080/oss/client/create.g");   
TCHAR headerContentLength[64];   
_stprintf(headerContentLength, _T("Content-Length: %d\r\n\r\n"), strlen(utf8PostData)); //注意结尾有两个\r\n   
   
// 添加header 信息   
bRet = HttpAddRequestHeaders(hOpenRequest, headerLanguage,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerEncoding,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerCharset,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerContentType, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerHost, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerOrigin, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerReferer, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
bRet = HttpAddRequestHeaders(hOpenRequest, headerContentLength, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

也可以把所有的头信息写到一个字符串,再添加上去。

我们的http请求网址到底应该怎么填写?毕竟这才是我们的核心内容啊。我们来一个实例,请求以下网址:
http://www.hootina.org/index.php?preview=1 ;
因为http协议的默认端口号是80,所以这个网址也等价于:
http://www.hootina.org:80/index.php?preview=1
这是一个get请求。那么我们可以这么写:

HINTERNET hInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hHttpSession = InternetConnect(hInternet, "www.hootina.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", "/index.php?preview=1", NULL, "", NULL, 0, 0);

如果是不带get参数的网址:
http://www.hootina.org/index.php?preview=1
则写成

HINTERNET hInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hHttpSession = InternetConnect(hInternet, "www.hootina.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", "/index.php", NULL, "", NULL, 0, 0);

可得出:

InternetOpen

1.第一个参数为Microsoft Internet Explorer或者Http-connect,好像没什么讲究

2.第二个参数为INTERNET_OPEN_TYPE_DIRECT,基本都是这个

其他的可以为NULL

InternetConnect 

1.第二个参数为具体的网址

2.第三个参数为端口号,默认为80

3.第六个参数为INTERNET_SERVICE_HTTP,表示连接到一个HTTP服务器上。

其他的可以为NULL

HttpOpenRequest

1.第二个参数为GET或者是POST.

2.第三个参数为url分离出来的后面部分,如上面的"/index.php?preview=1"

3.第四个参数为http的版本,如是L"HTTP/1.1"

其他的可以为NULL或者0

HttpAddRequestHeadersA

1.第二个参数:设置的参数,见上面HttpAddRequestHeadersA函数的讲解

2.第三个参数:设置参数的大小

3.第四个参数:HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE

HttpSendRequestW

见上面HttpSendRequestW函数的讲解

HttpQueryInfo

1.第二个参数:查询的类型,如状态码:HTTP_QUERY_STATUS_CODE,内容长度:HTTP_QUERY_CONTENT_LENGTH

2.第三个参数:buffer结构

3.第四个参数:设置参数buffer的大小

InternetReadFile

1.第二个参数:指向保留数据的缓冲区

2.第三个参数:指向保留数据的缓冲区的大小

3.第四个参数:本次已读入缓冲区字节数的变量的指针。如果返回值是TRUE,而且lpdwNumberOfBytesRead指向0,则文件已经读到了文件的末尾。

推出

1.请求行就是调用InternetOpen、InternetConnect 、HttpOpenRequest函数

2.请求头就是调用HttpAddRequestHeadersA

3.状态行就是调用HttpQueryInfo

另外的例子

string strRet;
    try
    {
        if ( NULL == lpUrl || wcslen(lpUrl) == 0 )
            throw HttpErrorParam;
        Release();
        m_hSession = InternetOpen(L"Http-connect", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
        if ( NULL == m_hSession )
            throw HttpErrorInit;
        INTERNET_PORT port    = INTERNET_DEFAULT_HTTP_PORT;
        wstring strHostName, strPageName;
        MyParseUrlW(lpUrl, strHostName, strPageName, port);
        if (port == INTERNET_DEFAULT_HTTPS_PORT)
            m_bHttps = true;
        m_hConnect = InternetConnectW(m_hSession, strHostName.c_str(), port, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
        if ( NULL == m_hConnect )
            throw HttpErrorConnect;
        DWORD dwFlags = INTERNET_FLAG_RELOAD;
        if (m_bHttps)
            dwFlags |= (INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID);
        m_hRequest = HttpOpenRequestW(m_hConnect, (type == HttpGet) ? L"GET" : L"POST", strPageName.c_str(), L"HTTP/1.1", NULL, NULL, dwFlags, NULL);
        if ( NULL == m_hRequest )
            throw HttpErrorInit;
        BOOL bRet = FALSE;
        DWORD dwHeaderSize = (NULL == lpHeader) ? 0 : wcslen(lpHeader);
        DWORD dwSize = (lpPostData == NULL) ? 0 : strlen(lpPostData);
        std::string httpHeaders = m_header.toHttpHeaders();
        HttpAddRequestHeadersA(m_hRequest, httpHeaders.c_str(), httpHeaders.size(), HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
        bRet = HttpSendRequestW(m_hRequest, lpHeader, dwHeaderSize, (LPVOID)lpPostData, dwSize);
        if (!bRet)
            throw HttpErrorSend;
        char szBuffer[READ_BUFFER_SIZE+1]={0};
        DWORD dwReadSize = READ_BUFFER_SIZE;
        m_nResponseCode = QueryStatusCode();
        if (m_nResponseCode == HTTP_STATUS_NOT_FOUND) {
            throw HttpError404;
        }
        while (true)
        {
            bRet = InternetReadFile(m_hRequest, szBuffer, READ_BUFFER_SIZE, &dwReadSize);
            if (!bRet || (0 == dwReadSize))
                break;
            szBuffer[dwReadSize] = '\0';
            strRet.append(szBuffer, dwReadSize);
        }
    }
    catch(HttpInterfaceError error)
    {
        m_paramsData.errcode = error;
    }
    return strRet;

具体例子可参考代码:

链接:https://pan.baidu.com/s/1QYYxRmcE_jLcDGbfPa6Rmw 
提取码:1oej

wininet InternetOpen\InternetOpenUrl\InternetReadFile 等相关推荐

  1. InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明

    InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明 摘要 这篇技术性文章讨论了如何利用Microsoft Win32 ...

  2. InternetOpen/InternetOpenUrl/InternetReadFile 等相关Win32 网络API 使用详细说明

    摘要 这篇技术性文章讨论了如何利用Microsoft Win32网络函数创建一个网络浏览器.这篇文章的宗旨是让读者了解一些Win32网络函数的作用.能力和使用范围,而不是为这些功能给出一个详细的文档. ...

  3. 【转帖】InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明...

    摘要 这篇技术性文章讨论了如何利用Microsoft Win32网络函数创建一个网络浏览器.这篇文章的宗旨是让读者了解一些Win32网络函数的作用.能力和使用范围,而不是为这些功能给出一个详细的文档. ...

  4. InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle

    文章目录 InternetOpen 函数功能 函数声明 第一个参数 第二个参数 第三个参数 第四个参数 第五个参数 返回值 补充: InternetOpenUrl 函数功能 函数声明 第一个参数 第二 ...

  5. InternetOpen, InternetOpenUrl, InternetReadFile 获取网页源代码

    使用InternetOpen初始化WinINet函数,然后在使用InternetOpenUrl打开指定链接,最后就用InternetReadFile就能读取到网页源代码. 下面的代码能够打开http: ...

  6. 用 WinInet InternetOpen做一个简单的下载器

    环境: win7 64位 vs2008 ( MFC ASCii) 参考文章:MSDN Wininet 错误码 利用WinINet进行网络程序的编程 写在开头:本文中是用的同步方法 , 好处是比较简单, ...

  7. 第7章 分析恶意的windows程序

    1. windows API 1.1类型和匈牙利表示法 windows API使用的变量名会使用前缀来说明它的类型,是一种命名规范 windows API的常见类型 1.2 句柄 在windows中表 ...

  8. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  9. 学习笔记-第十四章 恶意代码分析实战

    第十四章 恶意代码的网络特征 1.网络应对措施. 网络行为的基本属性包括IP地址,TCP端口,以及流量内容等,网络和安全 设备可以利用它们,来提供网络应对措施.根据IP地址和端口,防火墙和路由器可以限 ...

  10. VC++2019 使用wininet下载文件

    做个文件下载Demo:使用wininet:先只是下载文件:一般多数情况开发下载功能都使用多线程:先来看wininet的使用: VC6的程序运行如下: 添加wininet库: VC2019:新建一个对话 ...

最新文章

  1. Django——restframework(serializers序列化工具)
  2. 【Python】【函数式编程】
  3. goland idea设置代码自动换行
  4. 收集程序员动图,不幽默我捶自己!
  5. python解释器环境中用于表示上一次运算结果的特殊变量_判断正误 PUSH CL_学小易找答案...
  6. 浏览器显示linux桌面,如何从Web浏览器远程监视Linux服务器和桌面
  7. 利用innerHTML实现隐显效果-两种实现方法
  8. Python 测试驱动开发读书笔记(一)使用功能测试协助安装Django
  9. 谷歌再次修复已遭利用的两枚高危0day (CVE-2020-16009/16010)
  10. Latex调节目录间距\tableofcontents
  11. 【C++ 程序】 小游戏汇编
  12. sql 按名称首字母拼音排序
  13. 使用Python绘制热图的库 pyHeatMap 使用Python绘制热图的库 pyHeatMap
  14. 辞职信前端源码文件分享
  15. 自动化运维工具inception+archer
  16. 有没有测试水泥稳定性的软件,水泥稳定碎石基层的试验检测项目有哪些?急 急 急!!!...
  17. vue中使用svg图片
  18. 自媒体文章一文多发的几种方式
  19. 21个有用的python工具
  20. [论文阅读] Structure-Consistent Weakly Supervised Salient Object Detection with Local Saliency Coherence

热门文章

  1. SVN和Git 介绍,区别,优缺点,适用范围总结
  2. EJB2的3本好书第3本 EJB Cookbook
  3. 部署FIM 2010 R2——7验证不同林之间相同用户名密码同步
  4. 《威胁建模:设计和交付更安全的软件》——3.11 小结
  5. Linux上的查找命令之locate查找
  6. 将hta包装为exe发布
  7. 安全卫士分析--号码归属地
  8. (转贴)正则表达式学习心得体会(1)
  9. mongotemplate.insert 是否成功判断_河北外观专利申请成功的必要条件
  10. waitpid最后以一个参数设为0_变频器用远传压力表控制恒压供水参数设置