原始链接为:(至少今天还有效的)
http://218.16.119.106:8081/183429/0144/伊能静%20-%2017岁.lrc1、一定要用IE的文件下载对话框打开链接(DoFileDownload是方法之一)
2、等弹出“另存为”对话框时,文件名一栏已经填好“17岁.lrc”
只等用户按“保存”了。链接复制到IE地址栏是可以下载的,但请问程序中如何做到以上两点呢?

解决方案 »

  1.   

    用另外一个未公开的API下载函数可以达到你想要的效果 一下子想不起来 自己去查查看啊
      

  2.   

    老大,你都知道是未公开啦,怎么查?用MSDN?
      

  3.   

    用URLDownloadToFile 试试Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
      

  4.   

    谢谢楼上兄弟,但是你没有看清顶楼!1、一定要用IE的文件下载对话框打开链接(DoFileDownload是方法之一)
    再次强调,URLDownloadToFile是无法打开中间有跳转的链接的!
    (我不会去分析中间链接的临时数据的,低效、不可靠、太烦)
    目前我试下来最直接、可靠、方便的方法,只有调用IE下载对话框。
      

  5.   

    这里有个DoFileDownload的代码,可以下载你上面的连接http://vbnet.mvps.org/code/internet/dofiledownloadcustom.htm稍做修改就好
      

  6.   

    谢谢老大,只是不行啊 :(说实话,真没想到,老外也会写出这么烂的代码:(上面的代码,充其量只是修改注册表设置下载路径而已,根本没有做到顶楼的第二点要求(已设置好文件名),搞不懂,为什么还要用Hook(这是我认为的,就是不断监视的意思,不是传统意义上的Hook,具体代码见下)
          Do
             hwndDlg = FindWindow("#32770", "File Download")
          Loop While hwndDlg = 0
    这是它的硬伤,根本没有意义,反而造成死翘翘。我目前的实际用处是:
    由于现在用小猫上网,没办法,谁叫俺的Money不是贪污来的。所以,只能尽量同一时间多做点事情。
    在浏览网页时,看见需要的链接就点它,继续浏览。由于小猫的关系,不知不觉中,等俺点到20多个链接时,第一个IE下载对话框才刚刚打开。如果照老外的办法,每个链接都去“Hook”的话,说不定连机子都当了。所以,我的想法是:
    1、在发出下载要求时就设定好保存路径及默认文件名(代码不用再去管它了),只需要弹出对话框等用户确认而已。(拜托各位不要再提URLDownloadToFile——没有用的!!!)2、希望有这样一个系统消息(不要笑,这只是俺的想法而已),当IE另存为对话框打开时才收到,到时再想办法修改文件名的名字。如果可能的话,第一种是最好的,还请各位老大帮帮忙,谢谢:)
      

  7.   

    接下来,再谈谈为什么要用这个链接的原因:http://218.16.119.106:8081/183429/0144/伊能静%20-%2017岁.lrc一般调用DoFileDownload前要有一句StrConv(URL,vbUnicode)不知道有啥用,但确实必要,还请哪位知道的大哥解释一下?但顶楼的链接比较特殊,加上StrConv这一句,反而会打不开的!
    实际的办法,就是不用StrConv,结果就是——可以打开链接,但文件名部分呈现乱码,郁闷还请豆子老大再帮帮小弟,有没有绿豆大补膏啊? :)再加一句,虽然就顶楼的这个链接来说,不需要中间跳转,也就是说,用URLDownloadToFile是可以下载到这个链接的。但请注意:本贴,主要是讨论,如何使用IE下载对话框,预先设定下载文件名,所以请使用弹出IE下载框的办法,在本楼之后再使用URLDownloadToFile的办法,那不可能有分的,谢谢!
      

  8.   

    StrConv(URL,vbUnicode)是其中一个可以修改的地方,可以把DoFileDownload的那个url参数声明改成ByVal As Long,然后下面不用strconv,直接用StrPtr传url变量的字符串首地址过去就可以了,因为,大家都知道,bstr本身就是双字节的。其实,办法是一定会有的,呵呵,偶有空再看看
      

  9.   

    老大就是老大,厉害!
    终于解决了1。5个问题了,剩下的就是添上默认文件名的问题了,老大快有空啊,呵呵 :)另外,想问一下,能否获得最终链接的文件名呢?
    比如说,上面的链接,经过打开后,最终的文件名为:伊能静 - 17岁.lrc我想先取到这个文件名进行预处理后,再填到文件名一栏,这又该如何呢?
      

  10.   

    取到名字不是很难,用一般的字符分析(例如判断最后1个反斜杠的位置)或者简单的api(例如PathFindFileName)就可以了,现在的主要问题是怎么操纵后面弹出来的通用对话框。对于这个问题,我现在脑海里首先浮现的是用apihook的方法,因为用其他方法都有点取巧的感觉,不能进行很精确的控制。总之,比较麻烦,所以偶需要点时间……
      

  11.   

    取到名字真的不难吗?那这样的链接,名字是多少?
    http://pv.cga.com.cn/counter.asp?id=3呵呵,只有当另存为对话框打开时,才知道哦。那问题又回到了啥时知道对话框已打开?(循环监视,俺可不干!!!)诚心期待中,俺也一块想,老大加油啊,谢谢! :)
      

  12.   

    终于找到了 因为是直接调用IE下载 所以可以下载加密过的网址Private Declare Function DoFileDownload Lib "shdocvw" (ByVal lpszfile As String) As Long
    DoFileDownload StrConv("http://pv.cga.com.cn/counter.asp?id=3", vbUnicode)别忘记给偶加分啊
      

  13.   

    放心,老兄,为了给分,俺又给主题加分了,只要有人顶,俺还会加的,谢谢兄弟支持!不过从本主题顶楼起,俺就说了用老兄的方法,是不能正确打开顶楼链接的。
    如何正确打开,上几楼豆子老大已经解决了,大家也可以参考一下。俺给出的第二个链接,只是为了回应豆子说的:
    //取到名字不是很难,用一般的字符分析(例如判断最后1个反斜杠的位置)或者简单的api(例如PathFindFileName)就可以了本主题,现在的问题就是第2点,预先取到和设置默认文件名了。(请参考顶楼)
      

  14.   

    这个预先取到文件名,和设置文件名,肯定要牵涉到和IE打交道,就象老大说的:
    //脑海里首先浮现的是用apihook的方法
    //总之,比较麻烦,所以需要点时间……
      

  15.   

    不过,偶这是vb6+xp的版本,对象你这样喜爱vb5的似乎........
      

  16.   

    VB5的F1超小强嘛,呵呵:)
    有时候确实要用到98的,VB5更方便点
    说实话,俺觉得VB5最郁闷的一点就是,V型变量不支持UDT,俺以前很多数据都是UDT的,郁闷。
    不过,VB5的F1实在比VB6的方便多了,俺每天都要用到,实在不能想象没有F1的日子。基本上,只要VB6里不要用到一些特殊的功能,VB5还是可以兼容它的。目前,对于 Replace Join Split 这些函数,在VB5里都没有问题。谢谢老大了!开心 ^-^
      

  17.   

    vb5的帮助比vb6方便?木啥感觉哈我已经把一切包装好了,你用的时候只要写这些代码就好了Option ExplicitPrivate WithEvents m_oVBDownload As CVBDownloadFilePrivate Sub Command1_Click()
        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
      

  18.   

    可惜不能用:(出现以下错误(俺只有VB5,不知哪里出问题了)1、CVBMemoryAllocator
    '释放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还请老大多费心了,再次感谢!
      

  19.   

    Private Declare Function DoFileDownload Lib "shdocvw.dll" (ByVal lpszFile As String) As Long
    Private Sub Lbdown_Click()
    Const Url As String = "http://update.cz88.net/soft/qqwry.rar"
    DoFileDownload StrConv(Url, vbUnicode)
    End Sub
    这样行不行
      

  20.   

    To IORI915189(八神):
    呵呵,刚发现,俺自己太粗心了,老兄就是最早告诉我,说有未公开的API函数的那位兄弟,再次表示感谢:)只是,那个API就是本主题的标题哦,正因为不能用它正确打开顶楼的链接才会有本主题哦(现在已经解决了这个问题)另,To 楼上的兄弟:请看顶楼要求2 谢谢
      

  21.   

    To 豆子老大:
    因为VB6的帮助比VB5贵一倍,以至于目前中国大部分情况看,VB6是没有F1功能的。
    所以,相比之下,VB5的F1实在是强多了 :)
      

  22.   

    哇塞,你不会是用正版的吧........偶木有vb5不好调试啊~~~1.可能有其他地方有叫Release的函数,你把Release改个名字看看
    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