'转自“都市夜猫 dtfdkf”
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://dkfdtf.blogbus.com/logs/20284731.html
通常我们使用 IE 或 WebBrowse 对象来保存当前网页到本地文件的代码如下:
m.cSrc = 'http://www.163.com'
m.cTag = 'c:/163.htm'
m.oe = CreateObject( 'InternetExplorer.Application' )
m.oe.Navigate( m.cSrc )
m.oe.Visible = .T.
WAIT WINDOW TIMEOUT 2
m.oe.ExecWB( 4, 1, m.cTag )
但这里有一个问题,执行 ExecWB 时会弹出一个用户确认对话框,MSDN 指出第二个参数可用的取值为:
typedef enum
{
OLECMDEXECOPT_DODEFAULT = 0,
OLECMDEXECOPT_PROMPTUSER = 1,
OLECMDEXECOPT_DONTPROMPTUSER = 2,
OLECMDEXECOPT_SHOWHELP = 3
} OLECMDEXECOPT;
然而无论如何取值都无法取消这个对话框,按照 ms 的解释(http://support.microsoft.com/kb/244757/en-us),这个对话框是无法取消的,只能用 URLDownloadToFile 看来替代。但是,URLDownloadToFile API 只能将网页保存为 html 格式的文件,而无法用 MHTML Document 格式来保存。
今天看到一种使用 CDO.Message 对象来保存为 mht 格式的方法:
#define aveCreateNotExist 1
#define adSaveCreateOverWrite 2
m.cSrc = 'http://www.microsoft.com'
m.cFile = 'c:/'
m.cdo = CreateObject( 'CDO.Message' )
m.cdo.CreateMHTMLBody( m.cSrc, 0, '', '' ) && 0 - CdoMHTMLFlags
m.ado = m.cdo.GetStream()
m.cTitle = m.ado.ReadText()
m.cTitle = STREXTRACT( m.cTitle, '<title>', '</title>', 1, 3 )
m.ado.SaveToFile( m.cFile + m.cTitle + '.mht', adSaveCreateOverWrite )
STORE NULL TO m.ado, m.cdo
这是其中的关键代码,要正确处理所有情况,可能需要先清除网页缓存,判断 title 是否合法,设置保存的字符集等。