我参考一个获取图片的C#代码,改写成了vc代码,都是用XMLHTTPRequest设置用户名密码,在HTTP服务器获取图片数据,vc程序里有时候能够取得图片有时却得不到,图片的长度为0,而C#代码却没有问题!!不知何故
分别贴出C++和C#代码.....
再介绍下大体情况,我在编写一个事件服务,在两个端口监听,一个是监听事件,一个是监听客户端连接然后往客户端发送事件的,监听到事件后获取事件相关XML,然后解析从中获取图片地址,然后用XMLHTTPRequest取得图片数据,解析xml并获取图片在一个线程内运行,有连续事件时会有多个线程同时运行。不知是否多线程造成了图片获取出错
分别贴出C++和C#代码.....
再介绍下大体情况,我在编写一个事件服务,在两个端口监听,一个是监听事件,一个是监听客户端连接然后往客户端发送事件的,监听到事件后获取事件相关XML,然后解析从中获取图片地址,然后用XMLHTTPRequest取得图片数据,解析xml并获取图片在一个线程内运行,有连续事件时会有多个线程同时运行。不知是否多线程造成了图片获取出错
public byte[] GetAlertSnapshot(string snapshotUrl )
{
try
{
string URI = getDeviceURI( this.txtDevice.Text);
URI += getResourceURL(snapshotUrl);
// setting parameters
HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
request.Method = "GET";
request.KeepAlive = true;
request.Timeout = ClsParams.HttpRespTimeOut;
System.Net.Cookie cookie = connCookie;
CookieContainer cookieCon = new CookieContainer();
cookieCon.Add(request.RequestUri, cookie);
request.CookieContainer = cookieCon; // receive data
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = response.GetResponseStream();
string contLenStr = response.Headers["Content-Length"].ToString();
int contLen = System.Convert.ToInt32(contLenStr);
byte[] data = new byte[contLen]; int recvLen = 0;
do
{
int wantToRead = contLen - recvLen;
recvLen += responseStream.Read(data, recvLen, wantToRead);
} while (recvLen > 0 && recvLen < contLen);
responseStream.Close();
if (recvLen > 0)
{
byte[] picData = new byte[recvLen];
Array.Copy(data, 0, picData, 0, recvLen);
return picData;
}
return null;
}
catch (Exception ex)
{
}
}
这是c#代码,这个没问题
void GetAlertSnapshot( char * snaphot,AlertDetail * alertDetail,int snapShotIndex)
{
//组装图片url
CString deviceAddr;
deviceAddr.Format("http://%s:%d",ip,port);
deviceAddr.Append(snaphot);
MSXML2::IXMLHTTPRequestPtr m_spXMLHTTPRequest;
m_spXMLHTTPRequest = NULL;
m_spXMLHTTPRequest.CreateInstance(L"Msxml2.XMLHTTP.4.0");
if (NULL != m_spXMLHTTPRequest)
{
m_spXMLHTTPRequest->open("GET", deviceAddr.AllocSysString(), VARIANT_FALSE,userName,passWord);
m_spXMLHTTPRequest->send();
//取得图片长度
_bstr_t responseHeader("Content-Length") ;
_bstr_t Contentlength =m_spXMLHTTPRequest->getResponseHeader(responseHeader);
//取得图片数据
_variant_t dataVar= m_spXMLHTTPRequest->GetresponseBody();
if (strncmp("TripwireEventSynopsis",alertDetail->eventType,strlen("TripwireEventSynopsis"))==0)
{
if ((LPCTSTR)Contentlength!=NULL)
{
int length = atoi(Contentlength);
alertDetail->snapshots.snapshots[snapShotIndex].snapshotData =dataVar;
alertDetail->snapshots.snapshots[snapShotIndex].snapshotSize=length;
}
else
{
COleSafeArray safearray;
LONG len;
//VARIANT型变量转换为ColeSafeArray型变量
safearray=dataVar;
//得到有效数据长度
len=safearray.GetOneDimSize();
if (0 == len)
{
::MessageBox(NULL,"图片长度为0","",0);
}
}
}
}
}
这是c++代码,这个有问题
VARIANT_FALSE就说明是同步的,再说这里同步异步会影响结果吗
VT_UNKNOWN | VT_BYREF A pointer to the IUnknown interface is passed in ppunkVal. The pointer to the interface is stored in the location referred to by ppunkVal.