时间很紧,我才出此下策贴上大段代码
急盼您指教,如果您指教不了,就请多顶一把
这里还是有些可以让初学者学习的东西的问题是传进去的 图片URL 和 文件名 都是空的在一个线程回调函数中分析html页面,提取出符合条件的完整图片链接地址
给一个结构指针提供给图片下载线程回调函数,这个结构如下
struct SPicPick
{
CCriticalSection* pcs;   // 指向线程外用来控制对下面的 计数变量 和 原文 访问的临界对象
int* pnCount;            // 指向线程外统计图片是否都下载完的计数变量的指针
CString szPicUrl;        // 图片URL
CString szPicPath;       // 下载后的图片本地文件名
CString* pszArti;        // 指向线程外那个原文的指针,要把 图片URL 替换为 下载后的图片本地保存地址
};下面这段代码是用来开启图片下载线程的线程回调函数中的片段CString szArti;  // 表示原html文件
int nPic;  // nPic是个统计vszPic中元素个数的变量,用来指示是否所有图片下载完毕
...
int nUrlId = 1;  // 这里先假定它为1,其实它是个变量,对每个不同szArti都不同
int nCount = 0;  // 用来对不同的文件命名,免得冲突   
CCriticalSection csNpic;  // 控制对下面的 计数变量 和 原文 访问的临界对象
pvszPic = vszPic.begin();  // vszPic是个以CString对象为元素的向量,每个元素即为一个 图片URL
while (pvszPic != vszPic.end())
{
nCount++;
// 组织图片下载线程需要的参数
SPicPick sPicPick;
sPicPick.pcs = &csNpic;
sPicPick.pnCount = &nPic;
sPicPick.szPicUrl = *pvszPic;
sPicPick.pszArti = &szArti;
sPicPick.szPicPath.Format(_T("%d_%d.jpg"), nUrlId, nCount);  // 图片保存文件名

AfxBeginThread(ThreadPickPic, &sPicPick);  // 开启图片下载线
pvszPic++;
}
while (true)
{
// 等待图片下载完
::Sleep(50);
csNpic.Lock();
if (0 == nPic)
{
csNpic.Unlock();
break;  // 表示图片下载并处理完
}
csNpic.Unlock();
}
...而图片下载线程回调函数如下,为简便,把出错处理的代码去掉了UINT ThreadPickPic(LPVOID pParam)  // 采集图片的线程回调函数
{
SPicPick* psPicPick = (SPicPick *)pParam; #define HTTPBUFLEN 512 // size of HTTP buffer
char httpbuf[HTTPBUFLEN];
DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD;
DWORD dwFile = CFile::modeCreate | CFile::modeWrite | CFile::typeBinary; CInternetSession Is;
CStdioFile* pRemoteFile = Is.OpenURL((*psPicPick).szPicUrl, 1, dwFlag);  // 问题就在这里,传进来的图片URL
CFile cfDown((*psPicPick).szPicPath, dwFile);                            // 和文件名都是空的!!!
while (int nBytes = pRemoteFile->Read(httpbuf, HTTPBUFLEN))
{
cfDown.Write(httpbuf, nBytes);
}
pRemoteFile->Close();
Is.Close();

psPicPick->pcs->Lock();
(*((*psPicPick).pszArti)).Replace((*psPicPick).szPicUrl, *psPicPick).szPicPath);
(*(psPicPick->pnCount))--;
psPicPick->pcs->Unlock();
return 0;
}问题是这样传进去的 图片URL 和 文件名 都是空的
请问问题出在哪里,如果按照这样的思路,即把某
html文件中的每个不同图片按其URL用不同线程下载到本地,再把
图片URL替换为本地的文件,等这些图片都处理完了再进行
下一步工作,究竟该怎么做才好?