pp616(傻小子),进来一下

angle1219 2003-08-19 09:40:37
我作的一个ACTIVEX FORM 要实现HTTP下载的功能,我COPY了你以前的一段代码
如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

const char *FAcceptTypes = "*/*";
bool RequestRet;
HINTERNET FhSession; //会话句柄
HINTERNET FhConnect; //http连接句柄
HINTERNET FhRequest; //http请求句柄
DWORD dwRequest=BUFFER_MAX; //请求下载的字节数
DWORD dwRead; //实际读出的字节数
char Buffer[255];
char *NetBuf;
DWORD dwIndex=0;
DWORD BufLen=255;

//建立会话
FhSession = InternetOpen("test",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(FhSession==NULL)
{
//错误处理
}
//连接
FhConnect=InternetConnect(FhSession,
"http://172.16.40.146",
INTERNET_DEFAULT_HTTP_PORT,
NULL,NULL,
INTERNET_SERVICE_HTTP, 0, 0);
if(FhConnect==NULL)
{
InternetCloseHandle(FhSession); //关闭会话
//错误处理
}
//建立请求
FhRequest = HttpOpenRequest(FhConnect,
"GET", // 从服务器获取数据
"/download/vpnclient2000.exe", // 想读取的文件的名称
"HTTP/1.1", // 使用的协议
NULL,
&FAcceptTypes,
INTERNET_FLAG_RELOAD,
0);
if(FhRequest==NULL)
{
InternetCloseHandle(FhConnect);//关闭连接
InternetCloseHandle(FhSession);//关闭会话
//错误处理
}
//发送请求
RequestRet=HttpSendRequest(FhRequest,NULL,0,NULL,0); //这里总是FALSE!!!!
if(!RequestRet)//如果请求失败
{
InternetCloseHandle(FhRequest); //关闭请求
InternetCloseHandle(FhConnect); //关闭连接
InternetCloseHandle(FhSession); //关闭会话
//错误处理
}
/*得到文件大小。在这个例子里文件大小没什么用。所以下面4行代码被注释了
memset(Buffer,0x00,255);
dwIndex=0;
HttpQueryInfo(FhRequest,HTTP_QUERY_CONTENT_LENGTH,Buffer,&BufLen,&dwIndex);
FileSize=atoi(Buffer) */
if(FileExists("c:\\vpnclient2000.exe"))
DeleteFile("c:\\vpnclient2000.exe");

iFileHandle=FileCreate("c:\\vpnclient2000.exe");
if(iFileHandle==-1) throw(Exception("Error:FileCreate"));
//DWORD dwCount=OpenOutFile();

//读取文件数据
NetBuf=(char *)malloc(BUFFER_MAX);
while(true)
{
//dwRequest为准备读取的长度,dwRead返回了实际读取的长度
memset(NetBuf,0x00,BUFFER_MAX);
bool ReadReturn=InternetReadFile(FhRequest,(LPVOID)NetBuf,dwRequest,&dwRead);
if(!ReadReturn)break; //读取失败
if(dwRead==0)
{
//所有数据读取完成
break;
}
else
{
//NetBuf为读取的数据
//处理数据
// 保存数据
NetBuf[dwRead]='\0';
FileWrite(iFileHandle, Buffer, dwRead);
//dwCount = dwCount + dwRead;
// 发出下载进程事件
//DoOnProgress(dwCount);

}

}
free(NetBuf);
InternetCloseHandle(FhRequest); //关闭请求
InternetCloseHandle(FhConnect); //关闭连接
InternetCloseHandle(FhSession); //关闭会话

}

RequestRet=HttpSendRequest(FhRequest,NULL,0,NULL,0); //这里总是FALSE!!!!是哪一步有问题呢
...全文
68 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvjack 2003-08-20
  • 打赏
  • 举报
回复
to angle1219(阿光)

前面加上下面的

#pragma link "w32inet.lib"
还不行就把wininet.lib拷到工程所在目录
再不行就把urlmon.lib也拷过来
angle1219 2003-08-19
  • 打赏
  • 举报
回复
#include "urlmon.h"

#pragma hdrstop
#pragma comment(lib,"wininet.lib")
#include "Unit1.h"


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
HRESULT hRet=URLDownloadToFile(0,"http://www.csdn.net/demo/demo.txt",(ExtractFilePath(Application->ExeName)+"demo.txt").c_str(),0,0);
if(hRet==S_OK)
{
ShowMessage("下载完成");
}
else
{
ShowMessage("下载失败");
}
}
//---------------------------------------------------------------------------
出错:
[Linker Error] Unresolved external 'URLDownloadToFileA' referenced from D:\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
COKING 2003-08-19
  • 打赏
  • 举报
回复
HTTP下载:urlmon.lib
API :URLDownLoadToFile
简单多了。
COKING 2003-08-19
  • 打赏
  • 举报
回复
添加 URLmon.lib 文件
在$BCB \lib\psdk\

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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