本页帮助内容适合软件开发者阅读。
本软件提供了自动化接口供第三方软件调用以添加下载任务,类似于网际快车等下载软件,它也甚至可以在IE浏览器的右键菜单中被调用。不过由于本软件的优势不在于下载普通的网络文件,因为这些对于网际快车等软件已经做得很好了。所以本软件最有用的地方就是要被酷抓6等网址嗅探工具调用来添加下载任务。
本自动化接口的ProgramID为URLDownloader.COMAddTask。每了实现方便,作者还提供了接口的tlb文件供开发工具导入。注意,由于软件的自动化接口是直接封装在EXE中的,必须首先直接运行一次以使得它可以被注册到目标机器上,所以为了能确保其在调用前被注册,最好先创建它的进程(不过软件中也作了处理,所有的自动化调用前都会自动创建进程进行注册,实际上可以不先创建进程)。下面介绍本软件唯一的自动化接口(作者给出的为C/C++描述,其它语言可类推):
long AddUrls(VARIANT* varUrls);
参数varUrls为一个二维的安全数组(SafeArray),其第一维有五个元素,分别为网址(URL)、用户代理(User-Agent)、引用(Referer)、Cookie及整个请求头。第二维就是多个下载任务了。
返回值:如果返回S_OK(0),则表示调用正确,否则表示出错,目前返回出错代码有:ERROR_PROC_NOT_FOUND(127L,表示找不到刀锋下载的主窗口),ERROR_INVALID_PARAMETER(87L,表示传的参数错误)。当然为了调用不出问题,最好在调用的外围加入异常处理。
下面给出作者使用VC写的调用的一个例子:
//
为了确保自动化EXE能被注册,最好先直接运行EXE
CString strExePath; // Blader.exe的全路径
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
if(CreateProcess(strExePath, NULL, NULL, NULL,
FALSE, 0,
NULL, NULL,&StartupInfo,&ProcessInfo))
{
WaitForInputIdle(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
AfxMessageBox(_T("启动刀锋下载失败,请检查该文件是否存在!"));
return;
}
// 通过自动化启动下载工具
ICOMAddTaskPtr taskAdd; // 通过#import tlb文件得到的智能指针
if(taskAdd.CreateInstance(_T("URLDownloader.COMAddTask"))
!= S_OK)
{
AfxMessageBox(_T("向刀锋下载添加下载任务失败!"));
return;
}
// 创建二维SafeArray
SAFEARRAYBOUND bounds [2];
bounds[0].cElements = 5; // 一维,记录URL、User_Agent、Referer、Cookie、Header
bounds[0].lLbound = 0;
bounds[1].cElements = nSize; // 二维, nSize为任务数
bounds[1].lLbound = 0;
SAFEARRAY *psa = SafeArrayCreate(VT_VARIANT, 2,
bounds); // 创建二维数组
if(psa == NULL)
{
AfxMessageBox(_T("创建参数表失败!"));
return;
}
VARIANT varList;
varList.vt = VT_BSTR;
long ix[2] = {0};
CString strURL, strAgent, strRefer, strCookie,
strHeader; // 暂时没有处理User-Agent
CReportCtrl& rc = GetReportCtrl();
for(int i = 0; i < nSize; i ++)
{
strURL = rc.GetItemText(aItems[i], 2); // 从ListCtrl取数据
strRefer = rc.GetItemText(aItems[i], 3);
strCookie = rc.GetItemText(aItems[i], 4);
strHeader = (LPCTSTR)rc.GetItemData(aItems[i]);
if(!strURL.IsEmpty())
{
// 下面构造参数——二维SafeArray
ix[1] = i;
ix[0] = 0;
varList.bstrVal = SysAllocString(T2OLE(strURL));
SafeArrayPutElement(psa, ix, &varList);
ix[0] ++;
varList.bstrVal =
SysAllocString(T2OLE(strAgent));
SafeArrayPutElement(psa, ix, &varList);
ix[0] ++;
varList.bstrVal =
SysAllocString(T2OLE(strRefer));
SafeArrayPutElement(psa, ix, &varList);
ix[0] ++;
varList.bstrVal =
SysAllocString(T2OLE(strCookie));
SafeArrayPutElement(psa, ix, &varList);
ix[0] ++;
varList.bstrVal =
SysAllocString(T2OLE(strHeader));
SafeArrayPutElement(psa, ix, &varList);
}
}
varList.vt = VT_ARRAY | VT_VARIANT | VT_BYREF;
varList.pparray=&psa;
if(taskAdd->AddUrls(&varList) != S_OK)
{
AfxMessageBox(_T("添加下载任务到刀锋下载失败!"));
}
SafeArrayDestroy(psa);
|