急,调用HttpOpenRequest后,出现的异常,如何解决?

ismycxp 2010-03-06 11:28:29
搞了三天,没解决,希望高手来帮忙!

功能:通过wininet获取网页代码

环境:VS2008(win32控制台程序)(在VC6下没有此问题,很奇怪)
代码如下:

#include "stdafx.h"
#include <Windows.h>
#include <wininet.h>
#include <iostream>
#include <string>

#pragma comment(lib,"Wininet.lib")

#define __HTTP_ACCEPT_TYPE _T("*/*")
#define __HTTP_ACCEPT _T("Accept: */*")
#define __HTTP_VERB_GET _T("GET")
#define __HTTP_VERB_POST _T("POST")
#define __SIZE_BUFFER 1024

using namespace std;

#ifndef tstring
#ifndef _UNICODE
#define tstring string
#else
#define tstring wstring
#endif
#endif
//解析URL
void ParseURL(tstring strURL,tstring& strProtocol,tstring& strAddress,DWORD &dwPort,tstring& strURI)
{
DWORD dwPosition=0,dwStartPosition=0;
tstring::size_type nUrlSize=strURL.size();
BOOL bFlag=FALSE;

//查找协议,如:http://
while(dwPosition<nUrlSize)
{
if(strURL[dwPosition]==_T(':') && strURL[dwPosition+1]==_T('/') && strURL[dwPosition+2]==_T('/'))
{
break;
}
dwPosition++;
}

if(dwPosition==nUrlSize) //没有协议,如www.linuxsir.org/bbs/printthread.php?t=53761
{
strProtocol=_T("http");
dwPosition=0;
}
else if(strURL[dwPosition+1]==_T('/'))
{ //是一个协议
strProtocol=strURL.substr(0,dwPosition).c_str();
for(tstring::size_type i=0; i < strProtocol.size(); i++)
{
strProtocol[i] = tolower(strProtocol[i]);
}
dwStartPosition=dwPosition+=3;
}

while(nUrlSize>0 && dwPosition<nUrlSize && strURL[dwPosition]!=_T('/'))
++dwPosition;

DWORD dwFind=dwStartPosition;

for(;dwFind<=dwPosition;dwFind++){
if(strURL[dwFind]==_T(':'))
{ // find PORT
bFlag=TRUE;
break;
}
}

if(bFlag)
{
tstring strTmp=strURL.substr(dwFind+1,dwPosition-dwFind);
dwPort=_ttol(strTmp.c_str()); //端口
strAddress=strURL.substr(dwStartPosition,dwFind-dwStartPosition); //地址(域名)
}
else if(strProtocol==_T("https"))
{
dwPort=INTERNET_DEFAULT_HTTPS_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}
else
{
dwPort=INTERNET_DEFAULT_HTTP_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}

if(dwPosition<nUrlSize) strURI=strURL.substr(dwPosition,nUrlSize-dwPosition);
else strURI=_T("");
}



int _tmain(int argc, _TCHAR* argv[])
{
tstring strAgent=_T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
tstring strURL=_T("http://www.baidu.com/index.php");
tstring strProtocol,strAddress,strURI;
DWORD dwPort;
ParseURL(strURL,strProtocol,strAddress,dwPort,strURI);
HINTERNET _hHttpSession=::InternetOpen(strAgent.c_str(),INTERNET_OPEN_TYPE_PRECONFIG,_T(""),_T(""),0);
HINTERNET _hHttpConnection=::InternetConnect(_hHttpSession,
strAddress.c_str(),
dwPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
0);
if(::InternetAttemptConnect(NULL)!=ERROR_SUCCESS) return 0;
CONST TCHAR *szAcceptType=_T("*/*");

//就是下面这句出现问题,错误就是弹出一对话框,信息如下:
//ConsoleTest.exe 中的 0x7c84b57b 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突
//我检查了N遍,上面的代码都没错,连接也成功了,但就是HttpOpenRequest不成功 HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
&szAcceptType,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);

return 0;
}


请教高手,如何解决


...全文
521 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxcyly1985 2010-09-06
  • 打赏
  • 举报
回复
LPTSTR* lpAccpt = new TCHAR*[2];
*lpAccpt = csAcceptType.GetBuffer(1);
*(lpAccpt + 1) = NULL;
LPCTSTR* cLpAccept = (LPCTSTR*)lpAccpt;

再传入就不会有冲突了,那个是个二维数组指针,其实不是取指针的地址
ziplj 2010-03-06
  • 打赏
  • 举报
回复
引用 7 楼 ismycxp 的回复:
兄弟,这里为什么要加一个\0呢?

没什么用 copy的 只用强制转换就行了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 4 楼 ziplj 的回复:
试试 我这边测试成功的
C/C++ code
HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),//&szAcceptType,// (LPCWSTR*)szAcceptType, (LPCWSTR*)"*/*\0",
INTERNET_FLAG_KEEP_CONNECTION| INTERNET_FLAG_NO_CACHE_WRITE,
NULL);


兄弟,这里为什么要加一个\0呢?
ziplj 2010-03-06
  • 打赏
  • 举报
回复
用Unicode测试上面的代码 我这边测试通过了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
呵呵,谢谢你,解决了,给你加分
ziplj 2010-03-06
  • 打赏
  • 举报
回复
试试 我这边测试成功的

HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
//&szAcceptType,
// (LPCWSTR*)szAcceptType,
(LPCWSTR*) "*/*\0",
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);
ziplj 2010-03-06
  • 打赏
  • 举报
回复
引用 2 楼 ismycxp 的回复:
引用 1 楼 ziplj 的回复:
Unicode的问题  你把项目属性的Unicode换成多字节版本

啊,真的可以了,

但我一直以来都是用unicode,如果坚持unicode要怎么解决这个问题呢?

总不可能unicode没有此功能吧!
我在找解决方案 找了半天了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 1 楼 ziplj 的回复:
Unicode的问题  你把项目属性的Unicode换成多字节版本 


啊,真的可以了,

但我一直以来都是用unicode,如果坚持unicode要怎么解决这个问题呢?

总不可能unicode没有此功能吧!
ziplj 2010-03-06
  • 打赏
  • 举报
回复
Unicode的问题 你把项目属性的Unicode换成多字节版本
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 4 楼 ziplj 的回复:
试试 我这边测试成功的
C/C++ code
HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),//&szAcceptType,// (LPCWSTR*)szAcceptType, (LPCWSTR*)"*/*\0",
INTERNET_FLAG_KEEP_CONNECTION| INTERNET_FLAG_NO_CACHE_WRITE,
NULL);


(LPCWSTR*)"*/*\0",
//为什么这里不是_T("*/*\0"),我这里加上_T后就会出现异常,为什么会这样呀
访问真八字排盘系统介绍: 1、八字排盘 八字排盘是将年月日时按照天干地支的形式进行排列,一个时间单位代表了一个柱。八字由年柱、月柱、日柱和时柱共四个柱组成,也被称为四柱八字。八字学中基于中国阴阳五行、天干地支与刑冲克害、以及民间盲派的神煞论等方式,进一步预测爱情顺遂、工作高低、姻缘好坏、财富高低、学业成就、身体健康等事的学问。 八字排盘由以下元素组合:年月日时四柱、大运干支、胎元 、流年干支、十神、地势、神煞等。生辰八字不只是把干支历计算出来,而还要遵守月令、节令的强弱,时辰的阴阳变化进行校正。排盘分析,就是根据出生者的性别、天干地支的阴阳五行关系、进一步推算出来的一套方法论,给预测者做人生吉凶的参考数据,在未来事业、财运、婚姻、家庭等问题时,能做出风险较低的决策。 八字排盘怎么看 八字排盘由年、月、日、时四柱组成,每柱包含一个天干和一个地支,共八个字。年柱代表出生的年份,月柱代表出生的月份,日柱代表出生的日期,时柱则代表出生的时辰。每个柱的干支组合都会对个人的命运产生影响。天干地支旁边标注的正财、偏财、偏印、正印、比肩、劫财、食神、伤官、正官、七杀等,称为十神。 2、八字排盘软件介绍 我们是腾讯云市场金牌合作伙伴,广州正规软件开发公司,开发的八字排盘系统数据最全面精准,我们八字排盘采用最精确的排盘程序,而且运用“真太阳时”,进行更精确的时间划分。大家都知道我们使用的北京时间,是统一规定的标准时间。而八字排盘需要相对于太阳方位的天文时间,即平太阳时。我们国家地大物博,北京时间19时,哈尔滨已经夜幕降临,而新疆却还是太阳高挂,这时哈尔滨的天文时间可能在20:00以后,而新疆的天文时间可能在16时以前。北京时间是东经120度经线的平太阳时,如果您出生地的经度与北京时间所处的经度差异较大,或者处于单数时间点的前后,比如6点差一刻,8点,10点15分等

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧