注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

WININET API 几个可能会遇到,并且比较郁闷的问题。  

2013-02-16 23:31:44|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  1. 几个可能会遇到,并且比较郁闷的问题。
  2. 1. HttpOpenRequest的问题
  3. HttpOpenRequest的时候如果代码像下面这样写,一般不会出现什么问题。
  4. HINTERNET hRequest = HttpOpenRequest(hConnect,
  5. "GET",
  6. pszLoctionFilePath,
  7. HTTP_VERSION,
  8. NULL,
  9. (const char **)p,
  10. 0,
  11. 1);
  12. 倒数第二个参数:IN DWORD dwFlags,msdn上说明:dwFlags Internet flag values. Can be any of the following values: ……
  13. 看上去如果是0的话,应该没有什么问题。但我的问题就出在这里。
  14. 参数为0的话,就会在第二次访问同一个url(不同的url不会有问题)的时候,HttpQueryInfo会失败, GetLastError()为12150:Header Not Found。这个时候如果打开IE选项,general->delete->delete files。就好了。我用程序删除缓冲区里的全部文件,没有用。非得手动点击一下delete files。这个问题产生的原因还没有找到,如果有谁遇到过同样的问题,麻烦告诉我一声。
  15. 倒数第三个参数,我的写法是:
  16. char szHead[] = "Accept: */*\r\n\r\n";
  17. char **p = new char*[2];*p = szHead;*(p+1) = NULL;
  18. 之后倒数第三个参数为:(const char **)p,这样写不会有错。
  19. 如果写成(const char **)&szHead,程序不会报错,但debug调试的话,会有First-chance exception in HttpAndFtpTest.exe (KERNEL32.DLL): 0xC0000005: Access Violation.的警告,这是因为强制把一个1维数组变成2维数组,它的第二个数组没有'\0'结尾所导致的访问冲突。
  20. 2. 122错误
  21. HttpOpenRequest之后报122:The data area passed to a system call is too small. 错误,原因没有找到。但程序不会有错误,也没有警告。
  22. 3. 各个过程花费时间
  23. InternetOpen,InternetConnect,HttpOpenRequest,HttpQueryInfo基本上不花时间。HttpSendRequest和InternetReadFile,占用整个下载过程的绝大部分时间。
  24. 4. IE请求对应的程序的写法
  25. http://www.abc.com/123/edf.asp?Key=login&login=2&password=1
  26. 对应的IE请求
  27. // 连接服务器
  28. HINTERNET hConnect = InternetConnect(hSession,
  29. ServerName,
  30. INTERNET_DEFAULT_HTTP_PORT,
  31. NULL,
  32. NULL,
  33. INTERNET_SERVICE_HTTP,
  34. 0,
  35. 1);
  36. ServerName为http://www.abc.com/
  37. // 创建一个请求
  38. HINTERNET hRequest = HttpOpenRequest(hConnect,
  39. Method,
  40. FormAction,
  41. HTTP_VERSION,
  42. NULL,
  43. (const char**)&accept,
  44. 0,
  45. 1);
  46. Method为"GET"
  47. FormAction为/123/edf.asp
  48. BOOL bSeccuss = HttpSendRequest( hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata))
  49. frmdata为Key=login&login=2&password=1。
  50. 5. 删除IE缓存的函数
  51. void ClearInternetCache()
  52. {
  53. DWORD dwNeeded = 0;
  54. FindFirstUrlCacheEntry(NULL, NULL, &dwNeeded);
  55. if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
  56. {
  57. unsigned char *buffer = new unsigned char[dwNeeded];
  58. try
  59. {
  60. LPINTERNET_CACHE_ENTRY_INFO lpicei =
  61. reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
  62. HANDLE HFind = FindFirstUrlCacheEntry(NULL, lpicei, &dwNeeded);
  63. DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
  64. bool no_more_files = false;
  65. while (!no_more_files)
  66. {
  67. if (FindNextUrlCacheEntry(HFind, lpicei, &dwNeeded))
  68. {
  69. DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
  70. }
  71. else switch (GetLastError())
  72. {
  73. case ERROR_INSUFFICIENT_BUFFER:
  74. {
  75. delete [] buffer;
  76. buffer = new unsigned char[dwNeeded];
  77. lpicei = reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
  78. break;
  79. }
  80. default:
  81. {
  82. no_more_files = true;
  83. break;
  84. }
  85. }
  86. }
  87. FindCloseUrlCache(HFind);
  88. }
  89. catch (...)
  90. {
  91. delete [] buffer;
  92. }
  93. delete [] buffer;
  94. }
  95. }
  96. 6. http和https的请求
  97. InternetConnect 的第三个参数,INTERNET_DEFAULT_HTTP_PORT改为INTERNET_DEFAULT_HTTPS_PORT
  98. HttpOpenRequest 的第七个参数 多了一个INTERNET_FLAG_SECURE 选项
  99. 还有一个自动安装证书的代码以前做过,现在找不到了。
  100. 7. 更好的InternetOpen方法
  101. DWORD dwFlags = 1;
  102. InternetGetConnectedState(&dwFlags, 0);
  103. if(!(dwFlags & INTERNET_CONNECTION_PROXY))
  104. *hSession = InternetOpenA("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
  105. else
  106. *hSession = InternetOpenA("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  107. if (*hSession)
  108. return TRUE;
  109. else
  110. return FALSE;
  111. 8. 下载文件的函数
  112. UINT InternetGetFile (HINTERNET IN hConnect, // Handle from InternetOpen()
  113. LPCSTR szFileName)
  114. {
  115. FILE * pFile;
  116. if ( !(pFile = fopen (szFileName, "wb" ) ) )
  117. {
  118. return INTERNET_ERROR_FILEOPEN;
  119. }
  120. VOID* szTemp[16384];
  121. DWORD dwSize;
  122. while (TRUE)
  123. {
  124. // Keep coping in 16 KB chunks, while file has any data left.
  125. // Note: bigger buffer will greatly improve performance.
  126. if (!InternetReadFile (hConnect, szTemp, 16384, &dwSize) )
  127. {
  128. fclose (pFile);
  129. return INTERNET_ERROR_READFILE;
  130. }
  131. if (!dwSize)
  132. break; // Condition of dwSize=0 indicate EOF. Stop.
  133. else
  134. fwrite(szTemp, sizeof (char), dwSize , pFile);
  135. } // do
  136. fflush (pFile);
  137. fclose (pFile);
  138. return 0;
  139. }
  140. 9. 设置internet session
  141. 如果要设置internet session及其他参数,可以调用InternetSetOption。
  评论这张
 
阅读(488)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017