【高分求助】关于利用wininet进行网络编程的问题。
看了一些关于网络编程的简单资料以后决定自己尝试利用wininet进行文件下载的编程,首先找了一个msdn上的例子,cpoy下来后,边分析便尝试,但是发现获取下载文件的大小始终不对,不知道为什么?具体代码如下:
- C/C++ code
void __fastcall TForm1::DoOnStatusText(AnsiString Text)//信息提示
{
Memo1->Lines->Add(Text);
}
//---------------------------------------
void __fastcall TForm1::ParseURL(AnsiString FURL)//地址解析
{
AnsiString URL= FURL;
int i=URL.Pos("http://");
if(i>0)
{
URL.Delete(1, 7);
}
i=URL.Pos("/");
FHostName = URL.SubString(1, i-1);
FDownPath = URL.SubString(i, URL.Length());
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)//下载
{
ParseURL("http://www.26wz.com/ww_music/稻香周杰伦.MP3");
try
{
//建立会话
HINTERNET hSession = InternetOpen("WinInet Progress Sample",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if( hSession == NULL)throw(Exception("Error:InternetOpen"));
DoOnStatusText("ok:InterOpen");
//建立连接
HINTERNET hConnection = InternetConnect(hSession,
FHostName.c_str(), // Server
INTERNET_DEFAULT_HTTP_PORT,
NULL, // Username
NULL, // Password
INTERNET_SERVICE_HTTP,
0, // Synchronous
NULL); // No Context
if( hConnection == NULL)throw(Exception("Error:InternetConnect"));
DoOnStatusText("ok:InternetConnect");
//初使化下载请求
HINTERNET hRequest = HttpOpenRequest(hConnection,
"GET",
FDownPath.c_str(),
NULL, // Default HTTP Version
NULL, // No Referer
(const char**)"*/*\0", // Accept
// anything
0, // Flags
NULL); // No Context
if( hRequest == NULL)throw(Exception("Error:HttpOpenRequest"));
DoOnStatusText("ok:HttpOpenRequest");
//发送下载请求
HttpSendRequest(hRequest,
NULL, // No extra headers
0, // Header length
NULL, // No Body
0); // Body length
DoOnStatusText("ok:HttpSendRequest");
//获取文件大小
DWORD dwContentLen;
DWORD dwBufLen = sizeof(dwContentLen);
bool RetQueryInfo = HttpQueryInfo(hRequest,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
(LPVOID)&dwContentLen,
&dwBufLen,
0);
if( RetQueryInfo == false)throw(Exception("Error:HttpQueryInfo"));
DoOnStatusText("ok:HttpQueryInfo");
AnsiString msg = "filesize:" + AnsiString(dwContentLen);
DoOnStatusText(msg);
}
catch(Exception &exception)
{
DoOnStatusText(exception.Message);
}
}
由于出错位置在获取文件大小位置,所以后面的下载文件的部分就不贴出来了。
以上代码编译运行后,点下载按钮,信息提示框中得到的文件大小只有20,而实际文件大小有5,425,364 字节,不管怎么算都和20没联系...
望高手指正!谢谢!
[解决办法]
BCB版人气确实不太高啊,偶冒着被老板BS的危险帮楼主试了一下:建议用InternetOpenUrl直接处理整个的URL,它更有才,比我们自己分解URL好多了。
- C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender){ try { //建立会话 HINTERNET hSession = InternetOpen("WinInet Progress Sample", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if( hSession == NULL)throw(Exception("Error:InternetOpen")); DoOnStatusText("ok:InterOpen"); HINTERNET hRequest = InternetOpenUrl(hSession, "http://www.26wz.com/ww_music/稻香周杰伦.MP3", NULL, 0, INTERNET_FLAG_RELOAD, 0); if( hRequest == NULL)throw(Exception("Error:HttpOpenRequest")); DoOnStatusText("ok:HttpOpenRequest"); //获取文件大小 DWORD dwContentLen; DWORD dwBufLen = sizeof(dwContentLen); bool RetQueryInfo = HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER, &dwContentLen, &dwBufLen, 0); if( RetQueryInfo == false)throw(Exception("Error:HttpQueryInfo")); DoOnStatusText("ok:HttpQueryInfo"); AnsiString msg = "filesize:" + AnsiString(dwContentLen); DoOnStatusText(msg); } catch(Exception &exception) { DoOnStatusText(exception.Message); }}
[解决办法]
奇怪,楼主上面那段代码俺没发现问题呢?
毛毛,上面那套Wininet函数应该也是可以的呀!
[解决办法]
我也不知道,我在这里试的时候也得不到正确的大小,估计可能是HttpOpenRequest这步有什么小动作不正确