如何使用 HTTP 下載檔案

出自VFP Wiki

(修訂版本間差異)
跳轉到: 導航, 搜尋

在2005年11月11日 (五) 23:15所做的修訂版本


來源: http://support.microsoft.com/default.aspx?scid=kb;en-us;311306

此文章使用了兩個方法,一個是使用 urlmon.dll,另外一個則是使用 msinet active x.

using urlmon.dll

*-----------------------------------
* AUTHOR: Trevor Hancock (TREVORH@MICROSOFT.COM)
* CREATED: 10/24/01 03:07:28 PM for Microsoft Knowledge Base article Q311306
* ABSTRACT: Downloads a Web page and then parses the Web page to extract a stock quote.
*
* DETAILS: This code uses the function URLDownloadToFile(), located in
*          Urlmon.dll. This function downloads a Web page from
*          http://moneycentral.msn.com. Specifically, the function calls
*          "http://moneycentral.msn.com/scripts/webquote.dll?iPage=lqd&Symbol=",
*		passing to the Web page a stock symbol that the user types into THISFORM.txtSYMBOL.
*          The Web site returns an entire page of information about the
*          stock, which this code then parses to extract the current quote.
*-----------------------------------

PUBLIC ofrmURLMON

ofrmURLMON = NEWOBJECT("frmURLMON")
ofrmURLMON.SHOW
RETURN

**************************
DEFINE CLASS frmURLMON AS FORM
	HEIGHT = 83
	WIDTH = 317
	AUTOCENTER = .T.
	BORDERSTYLE = 2
	CAPTION = "Stock Quote via URLMON.DLL"
	MAXBUTTON = .F.
	MINBUTTON = .F.
	NAME = "frmURLMON"

	ADD OBJECT txtsymbol AS TEXTBOX WITH ;
		FONTNAME = "Verdana", ;
		VALUE = "MSFT", ;
		FORMAT = "!", ;
		HEIGHT = 26, ;
		LEFT = 94, ;
		TABINDEX = 1, ;
		TOP = 7, ;
		WIDTH = 100, ;
		NAME = "txtSymbol"

	ADD OBJECT cmdGetQuote AS COMMANDBUTTON WITH ;
		TOP = 7, ;
		LEFT = 206, ;
		HEIGHT = 27, ;
		WIDTH = 94, ;
		FONTNAME = "Verdana", ;
		CAPTION = "Get Quote", ;
		TABINDEX = 2, ;
		NAME = "cmdGetQuote"

	ADD OBJECT lblSymbol AS LABEL WITH ;
		AUTOSIZE = .T., ;
		FONTNAME = "Verdana", ;
		CAPTION = "Stock Symbol:", ;
		HEIGHT = 16, ;
		LEFT = 3, ;
		TOP = 12, ;
		WIDTH = 90, ;
		TABINDEX = 5, ;
		NAME = "lblSymbol"

	ADD OBJECT txtQuote AS TEXTBOX WITH ;
		FONTNAME = "Verdana", ;
		HEIGHT = 23, ;
		LEFT = 94, ;
		READONLY = .T., ;
		TOP = 39, ;
		WIDTH = 100, ;
		NAME = "txtQuote"

	ADD OBJECT lblQuote AS LABEL WITH ;
		AUTOSIZE = .T., ;
		FONTNAME = "Verdana", ;
		CAPTION = "Quote:", ;
		HEIGHT = 16, ;
		LEFT = 47, ;
		TOP = 42, ;
		WIDTH = 46, ;
		TABINDEX = 5, ;
		NAME = "lbQuote"

	PROCEDURE cmdGetQuote.CLICK
		LOCAL lcQuote AS STRING, ;
			lcTempTxtFile AS STRING, ;
			lnGetResults AS INTEGER, ;
			lcURL AS STRING

		lcQuote = ""
		*-- Set up a variable referring to a temp .TXT file.
		*-- Uses the current VFP TEMP DIR [SYS(2023)]
		*-- and a random file name [SYS(2015)]
		lcTempTxtFile = FORCEEXT(ADDBS(SYS(2023)) + SYS(2015), "TXT")
		lnGetResults = 0
		lcGetURl = "http://moneycentral.msn.com/scripts/webquote.dll?iPage=qd&Symbol=" + ;
			ALLT(THISFORM.txtsymbol.VALUE)

		DECLARE LONG URLDownloadToFile IN URLMON.DLL ;
			LONG, STRING, STRING, LONG, LONG

		WITH THISFORM
			*-- Get the quote using the Urlmon.dll and store it
			*-- to a temp .TXT file.
			*-- This function returns non-zero if it fails.
			lnGetResults = URLDownloadToFile(0, lcGetURl, lcTempTxtFile, 0, 0)
			IF lnGetResults # 0
				MESSAGEBOX("Download Failed",0,"")
				RETURN .F.
			ENDIF

			*-- Read the Web page into a variable, and then erase it.
			lcQuote = FILETOSTR(lcTempTxtFile)
			ERASE (lcTempTxtFile)

			*-- Grab the quote from the Web page. If in VFP 7.0 or later, we use the new
			*-- STREXTRACT() function to grab the data between two delimiters.
			*-- In VFP 6.0, use SUBSTR() to get the data, and then trim off any
			*-- trailing HTML with the TRANSFORM() AND VAL() functions.
			IF VERSION(5) => 700
				lcQuote  = STREXTRACT(lcQuote, [Last  ], [&nbsp])
			ELSE
				*-- Extract the quote from the HTML
				lcQuote = SUBSTR(lcQuote, ATC([Last  ], lcQuote) + 16, 8)
				*-- Trim off the trailing HTML. VAL() will only return the numbers,
				*-- which we then change to a string with TRANSFORM()
				lcQuote = TRANSFORM(VAL(lcQuote))
			ENDIF

			*-- Put the quote in the text box.
			.txtQuote.VALUE = "$" + lcQuote
		ENDWITH
	ENDPROC
ENDDEFINE
****************

using msinet active x control

*-----------------------------------
* AUTHOR: Trevor Hancock  (TREVORH@MICROSOFT.COM)
* CREATED: 10/24/01 03:07:28 PM for Microsoft Knowledge Base article Q311306
* ABSTRACT: Downloads a Web page and then parses it to extract a stock quote.
*
* DETAILS: This code uses the Msinet.ocx ActiveX control to
*          download a Web page from  http://moneycentral.msn.com. Specifically,
*          the function calls "http://moneycentral.msn.com/scripts/webquote.dll?iPage=lqd&Symbol=",
*          passing to the Web page a stock symbol that the user types into THISFORM.txtSYBMOL.
*          The Web site returns an entire page of information about the
*          stock, which this code then parses to extract the current quote.
*-----------------------------------

PUBLIC ofrmMSINET

ofrmMSINET = NEWOBJECT("frmMSINET")
ofrmMSINET.SHOW
RETURN

**************************
DEFINE CLASS ocxMSINET AS OLECONTROL
	OLECLASS = "InetCtls.Inet.1"
ENDDEFINE

**************************
DEFINE CLASS frmMSINET AS FORM
	HEIGHT = 70
	WIDTH = 304
	AUTOCENTER = .T.
	BORDERSTYLE = 3
	CAPTION = "Stock Quote via MSINET.OCX"
	MAXBUTTON = .F.
	MINBUTTON = .F.
	NAME = "frmMSINET"

	ADD OBJECT MSINET AS ocxMSINET WITH ;
		TOP = 37, ;
		LEFT = 234, ;
		HEIGHT = 100, ;
		WIDTH = 100, ;
		NAME = "MSINET"

	ADD OBJECT txtsymbol AS TEXTBOX WITH ;
		FONTNAME = "Verdana", ;
		VALUE = "MSFT", ;
		FORMAT = "!", ;
		HEIGHT = 26, ;
		LEFT = 94, ;
		TABINDEX = 1, ;
		TOP = 7, ;
		WIDTH = 100, ;
		NAME = "txtSymbol"

	ADD OBJECT cmdGetQuote AS COMMANDBUTTON WITH ;
		TOP = 7, ;
		LEFT = 206, ;
		HEIGHT = 27, ;
		WIDTH = 94, ;
		FONTNAME = "Verdana", ;
		CAPTION = "Get Quote", ;
		TABINDEX = 2, ;
		NAME = "cmdGetQuote"

	ADD OBJECT lblSymbol AS LABEL WITH ;
		AUTOSIZE = .T., ;
		FONTNAME = "Verdana", ;
		CAPTION = "Stock Symbol:", ;
		HEIGHT = 16, ;
		LEFT = 3, ;
		TOP = 12, ;
		WIDTH = 90, ;
		TABINDEX = 5, ;
		NAME = "lblSymbol"

	ADD OBJECT txtQuote AS TEXTBOX WITH ;
		FONTNAME = "Verdana", ;
		HEIGHT = 23, ;
		LEFT = 94, ;
		READONLY = .T., ;
		TOP = 39, ;
		WIDTH = 100, ;
		NAME = "txtQuote"

	ADD OBJECT lblQuote AS LABEL WITH ;
		AUTOSIZE = .T., ;
		FONTNAME = "Verdana", ;
		CAPTION = "Quote:", ;
		HEIGHT = 16, ;
		LEFT = 47, ;
		TOP = 42, ;
		WIDTH = 46, ;
		TABINDEX = 5, ;
		NAME = "lbQuote"

	PROCEDURE cmdGetQuote.CLICK
		LOCAL lcQuote AS STRING, ;
			lcURL AS STRING

		lcQuote = ""
		lcGetURl = "http://moneycentral.msn.com/scripts/webquote.dll?iPage=qd&Symbol=" + ;
			ALLT(THISFORM.txtsymbol.VALUE)

		WITH THISFORM
			*-- Get the quote using the Msinet.ocx ActiveX control.
			*--  The control will load it directly into a variable.
			lcQuote = .MSINET.OpenURL(lcGetURl)
			IF EMPTY(lcQuote)
				MESSAGEBOX("Download Failed.",0,"")
				RETURN .F.
			ENDIF

			*-- Grab the quote from the Web page. If in VFP 7.0 or later, we use the new
			*-- STREXTRACT() function to grab the data between two delimiters.
			*-- In VFP 6.0, use SUBSTR() to get the data, and then trim off any
			*-- trailing HTML with the TRANSFORM() AND VAL() functions.
			IF VERSION(5) => 700
				lcQuote  = STREXTRACT(lcQuote, [Last  ], [&nbsp])
			ELSE
				*-- Extract the quote from the HTML
				lcQuote = SUBSTR(lcQuote, ATC([Last  ], lcQuote) + 16, 8)
				*-- Trim off the trailing HTML. VAL() will only return the numbers,
				*-- which we then change to a string with TRANSFORM()
				lcQuote = TRANSFORM(VAL(lcQuote))
			ENDIF
			*-- Put the quote in the text box.
			.txtQuote.VALUE = "$" + lcQuote
		ENDWITH
	ENDPROC
ENDDEFINE
**************************