原始链接为:(至少今天还有效的)
http://218.16.119.106:8081/183429/0144/伊能静%20-%2017岁.lrc1、一定要用IE的文件下载对话框打开链接(DoFileDownload是方法之一)
2、等弹出“另存为”对话框时,文件名一栏已经填好“17岁.lrc”
只等用户按“保存”了。链接复制到IE地址栏是可以下载的,但请问程序中如何做到以上两点呢?
http://218.16.119.106:8081/183429/0144/伊能静%20-%2017岁.lrc1、一定要用IE的文件下载对话框打开链接(DoFileDownload是方法之一)
2、等弹出“另存为”对话框时,文件名一栏已经填好“17岁.lrc”
只等用户按“保存”了。链接复制到IE地址栏是可以下载的,但请问程序中如何做到以上两点呢?
再次强调,URLDownloadToFile是无法打开中间有跳转的链接的!
(我不会去分析中间链接的临时数据的,低效、不可靠、太烦)
目前我试下来最直接、可靠、方便的方法,只有调用IE下载对话框。
Do
hwndDlg = FindWindow("#32770", "File Download")
Loop While hwndDlg = 0
这是它的硬伤,根本没有意义,反而造成死翘翘。我目前的实际用处是:
由于现在用小猫上网,没办法,谁叫俺的Money不是贪污来的。所以,只能尽量同一时间多做点事情。
在浏览网页时,看见需要的链接就点它,继续浏览。由于小猫的关系,不知不觉中,等俺点到20多个链接时,第一个IE下载对话框才刚刚打开。如果照老外的办法,每个链接都去“Hook”的话,说不定连机子都当了。所以,我的想法是:
1、在发出下载要求时就设定好保存路径及默认文件名(代码不用再去管它了),只需要弹出对话框等用户确认而已。(拜托各位不要再提URLDownloadToFile——没有用的!!!)2、希望有这样一个系统消息(不要笑,这只是俺的想法而已),当IE另存为对话框打开时才收到,到时再想办法修改文件名的名字。如果可能的话,第一种是最好的,还请各位老大帮帮忙,谢谢:)
实际的办法,就是不用StrConv,结果就是——可以打开链接,但文件名部分呈现乱码,郁闷还请豆子老大再帮帮小弟,有没有绿豆大补膏啊? :)再加一句,虽然就顶楼的这个链接来说,不需要中间跳转,也就是说,用URLDownloadToFile是可以下载到这个链接的。但请注意:本贴,主要是讨论,如何使用IE下载对话框,预先设定下载文件名,所以请使用弹出IE下载框的办法,在本楼之后再使用URLDownloadToFile的办法,那不可能有分的,谢谢!
终于解决了1。5个问题了,剩下的就是添上默认文件名的问题了,老大快有空啊,呵呵 :)另外,想问一下,能否获得最终链接的文件名呢?
比如说,上面的链接,经过打开后,最终的文件名为:伊能静 - 17岁.lrc我想先取到这个文件名进行预处理后,再填到文件名一栏,这又该如何呢?
http://pv.cga.com.cn/counter.asp?id=3呵呵,只有当另存为对话框打开时,才知道哦。那问题又回到了啥时知道对话框已打开?(循环监视,俺可不干!!!)诚心期待中,俺也一块想,老大加油啊,谢谢! :)
DoFileDownload StrConv("http://pv.cga.com.cn/counter.asp?id=3", vbUnicode)别忘记给偶加分啊
如何正确打开,上几楼豆子老大已经解决了,大家也可以参考一下。俺给出的第二个链接,只是为了回应豆子说的:
//取到名字不是很难,用一般的字符分析(例如判断最后1个反斜杠的位置)或者简单的api(例如PathFindFileName)就可以了本主题,现在的问题就是第2点,预先取到和设置默认文件名了。(请参考顶楼)
//脑海里首先浮现的是用apihook的方法
//总之,比较麻烦,所以需要点时间……
有时候确实要用到98的,VB5更方便点
说实话,俺觉得VB5最郁闷的一点就是,V型变量不支持UDT,俺以前很多数据都是UDT的,郁闷。
不过,VB5的F1实在比VB6的方便多了,俺每天都要用到,实在不能想象没有F1的日子。基本上,只要VB6里不要用到一些特殊的功能,VB5还是可以兼容它的。目前,对于 Replace Join Split 这些函数,在VB5里都没有问题。谢谢老大了!开心 ^-^
With m_oVBDownload
.Download "http://pv.cga.com.cn/counter.asp?id=3"
End With
End SubPrivate Sub Form_Load()
Set m_oVBDownload = New CVBDownloadFile
End SubPrivate Sub m_oVBDownload_DoSth(lpstrFilter As String, lpstrCustomFilter As String, nMaxCustFilter As Long, nFilterIndex As Long, lpstrFile As String, nMaxFile As Long, lpstrFileTitle As String, nMaxFileTitle As Long, lpstrInitialDir As String, lpstrTitle As String, Flags As Long, nFileOffset As Integer, nFileExtension As Integer, lpstrDefExt As String)
'标题
Debug.Print lpstrTitle
lpstrTitle = "Hello World!"
'目标文件名
Debug.Print lpstrFile
lpstrFile = "MyExe"
'目标目录
Debug.Print lpstrInitialDir
lpstrInitialDir = "C:\"
End Sub完整代码我放在 http://60.191.21.235/mvps/supergreenbean_vbsrc/vbfiledownload.rar
'释放lIndex记录索引所指定内存记录所保存的内存地址
Public Function Release(ByVal lIndex As Long) As Boolean编译错误:
在该对象模块派生的对象模块中成员已存在
===================
这个错误实在不懂错在哪里?2、由于VB5中不允许返回数组,不允许直接给字符串数组赋值,所以我把以下几条改了,不知道是否可行?CVBAPIHooker
'16进制字符串变为字节数组
Private Function ByteCodeStrToBin(ByVal sByteCode As String) As Variant ' Byte()
Dim s As Variant ' () As StringCVBMiniWindow
'16进制字符串变为字节数组
Private Function ByteCodeStrToBin(ByVal sByteCode As String) ' As Byte()
Dim s As Variant ' () As String3、
CVBPEFnLocator
'从指针获取字符串
Private Function RemoteStrFromPtr(ByVal lpString As Long) As String lPosOfZero = InStrB(b, ChrB(0))
编译错误:
类型不匹配 (是 B 出错)
===========================
这一句我改成:
Dim I As Long
For I = 0 To 254
lPosOfZero = b(I)
If lPosOfZero <> 0 Then Exit For
Next还请老大多费心了,再次感谢!
Private Sub Lbdown_Click()
Const Url As String = "http://update.cz88.net/soft/qqwry.rar"
DoFileDownload StrConv(Url, vbUnicode)
End Sub
这样行不行
呵呵,刚发现,俺自己太粗心了,老兄就是最早告诉我,说有未公开的API函数的那位兄弟,再次表示感谢:)只是,那个API就是本主题的标题哦,正因为不能用它正确打开顶楼的链接才会有本主题哦(现在已经解决了这个问题)另,To 楼上的兄弟:请看顶楼要求2 谢谢
因为VB6的帮助比VB5贵一倍,以至于目前中国大部分情况看,VB6是没有F1功能的。
所以,相比之下,VB5的F1实在是强多了 :)
2.改成变体类型应该是可以的,具体木有测试,呵呵
3.instrb应该可以改成
for i=0 to ubound(b)
if b(i)=0 then lPosOfZero =i:exit for
next
if i>ubound(b) then lPosOfZero = 0