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!!!!是哪一步有问题呢
...全文
69 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\
走进Linq--Linq横空出世篇 某日编程大师云游到某处,见一刚毕业不久学过两天C#和两天SQL的coder在那里发牢骚,为啥我要写这么多for,这么多if才能查询出我需要的数据,为啥我不能像SQL那样,发送一条命令告诉数据库我需要啥样的数据,它就给我返回来。 编程大师如是说:傻小子,像SQL那叫第四代编程语言,常存在于象牙塔和研究所里面的学究语言,还有个高雅的名字:函数编程。它只需要你告诉它要什么,而不需要告诉它怎么做。而你使用的C#语言属于命令式编程,你必须像发送命令一样一步步的告诉你的机器怎么做。 发牢骚的coder回了一句:不懂,我只是想不通,数据库能做这样的处理,为啥C#这么牛的语言不能呢。编程大师心里想着:这是不可能的事情,因为C#它是强类型语言,)*&)(&)*)()*&%&%&^(后面省去200字)。 天色还未晚,编程大师就急匆匆的回家了,他心里一直记着那位发牢骚的coder的话:为什么不能,为什么不能。 晚上,编程大师做了一个梦,一个奇怪的梦,他的师傅“白眉”只说了三个字母:DSL。 编程大师想着,DSL,领域专用语言,师傅要对我说什么呢,难道和今天我遇见的事有关? 上面这段文字是一段调侃,调节一下气氛,呵呵。 我觉得Linq就是一种DSL,在C#等常规语言上抽象起来的,面向数据处理领域的特定“语言”,当然,它的根基还是这些常规语言。 select,from,where,group等关键字本来只是在SQL里出现,现在把它们引入到C#这些常规编程语言中。 那C#等是如何做到的呢?是在CLR底层支持的么?不是。既然“编译器”可以将C#编译成MSIL,那为什么编译不能干更多一点事情?将这些为了领域编程而出现关键字编译成原始语法。

13,822

社区成员

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

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