当然可以!用api函数进行copy,然后删除自己

解决方案 »

  1.   

    DeityFox(神狐) :您真高!能不能给兄弟看看你的这样运行的作品?
      

  2.   

    我发现DeityFox(神狐) 的本月专家分非常之高耶。
      

  3.   

    可以通过这样的方法:程序A,它的升级版B
       1、运行A,选择升级,A则拷贝B到A所在的目录下的Updata目录中
       2、从A中启动B,通过命令行传递一个参数给B
       3、A退出
       4、B接收参数后运行,开始拷贝自己到A所在目录,覆盖A
       5、结束后,B通过命令行传递一个参数给新的A,运行它
       6、B退出。
       这时,A就是更新后的拉!  
      

  4.   

    uguess(uguess) 是否这样:在A中:
    shell("b.exe 参数")
    end在B中:
    shell("copy a_1.exe a.exe")?
      

  5.   

    Command 函数
          返回命令行的参数部分,该命令行用于装入 Microsoft Visual Basic 或 Visual Basic 开发的可执行程序。语法Command说明当从命令行装入 Visual Basic 时,/cmd 之后的命令行的任何部分作为命令行的参数传递给程序。下面的示例中,cmdlineargs 代表 Command 函数返回的参数信息。VB /cmd cmdlineargs对于使用 Visual Basic 开发并编译为 .exe 文件的应用程序,Command 返回出现在命令行中应用程序名之后的任何参数。例如:MyApp cmdlineargs想知道如何在正在使用的应用程序的用户界面中改变命令行参数,请搜寻关于“命令行参数”的帮助。
      

  6.   

    Command 函数示例
    本示例在某个函数中用 Command 函数获得命令行参数,并将命令行参数以 Variant 类型之数组返回。Function GetCommandLine(Optional MaxArgs)
       '声明变量。
       Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
       '检查是否提供了 MaxArgs 参数。
       If IsMissing(MaxArgs) Then MaxArgs = 10
       ' 使数组的大小合适。
       ReDim ArgArray(MaxArgs)
       NumArgs = 0: InArg = False
       '取得命令行参数。
       CmdLine = Command()
       CmdLnLen = Len(CmdLine)
       '以一次一个字符的方式取出命令行参数。
       For I = 1 To CmdLnLen
          C = Mid(CmdLine, I, 1)
          '检测是否为 space 或 tab。
          If (C <> " " And C <> vbTab) Then
             '若既不是 space 键,也不是 tab 键,
             '则检测是否为参数内含之字符。
             If Not InArg Then
             '新的参数。
             '检测参数是否过多。
                If NumArgs = MaxArgs Then Exit For
                   NumArgs = NumArgs + 1
    InArg = True
                End If
             '将字符连接到当前参数中。
             ArgArray(NumArgs) = ArgArray(NumArgs) & C
          Else
             '找到 space 或 tab。
             '将 InArg 标志设置成 False。
             InArg = False
          End If
       Next I
       '调整数组大小使其刚好符合参数个数。
       ReDim Preserve ArgArray(NumArgs)
       '将数组返回。
       GetCommandLine = ArgArray()
    End Function
      

  7.   

    TO:vcbug(今夜最后一次陪你而醉)
    试试下面代码,看看能不能复制?Option Explicit
    Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As LongPrivate Sub Form_Load()
    If Right(App.Path, 1) <> "\" Then
        CopyFile App.Path & "\" & App.EXEName & ".exe", App.Path & "\" & "ddd.exe", 0
    Else
        CopyFile App.Path & App.EXEName & ".exe", App.Path & "ddd.exe", 0
    End IfEnd Sub
      

  8.   

    : DeityFox(神狐) 这样也算?我倒!
                       你是不是没有理解大家的意思啊?如果这样,还不如直接用VB的FileCopy呢!
      

  9.   

    TO :DeityFox(神狐) 厉害,厉害!佩服,佩服!如果是运行中的程序要直接修改自己的尸体呢?答出送200分!
      

  10.   

    偶的意思本是这样B运行是copy 自己 并覆盖A
    再在退出时写一批处理文件,并同时运行批处理文件来删除B自己
    这样不就更新了吗?
    TO:ByTheWay(&#157;到此一游)
    不知道修改B自己这样行不行?没试过!
      

  11.   

    : DeityFox(神狐) 这好像是我刚刚说的吧?
      

  12.   

    to : DeityFox(神狐) 估计是
      CopyFile App.Path & "\" & "ddd.exe", App.Path & "\" & App.EXEName & ".exe", 0
    才对。但是程序执行后,既不报错,也没有任何改变。
      

  13.   

    TO:uguess(uguess) 回复人: DeityFox(神狐) (2001-12-28 14:26:14)  得0分 
    当然可以!用api函数进行copy,然后删除自己  不就是这个意思?
    其实偶们都理解错了,偶上面这句化的意思就是这样,而你们理解成"覆盖正在运行的的程序"
      

  14.   

    to uguess:请问Optional MaxArgs是什么参数,如何调用此函数?
      

  15.   

    这里的高人真多!!!
    竟然还要shell("copy")!?
    还有CopyFile的!?
    大家能不能先学好基本I/O函数!
    在VB中拷贝的函数是:FileCopy "FileName","FileName"!
      

  16.   

    “再在退出时写一批处理文件,并同时运行批处理文件来删除B自己 ”
    好象只有当自己也为.bat时才可以 
      

  17.   

    试试这样的流程:
    1、程序打开后检查命令行,如果为空,将自身拷贝到某个目录,
    2、执行这个目录下的副本,并传递命令行,原EXE程序退出。
    3、副本判断如果命令行不为空,且符合某一规范,则程序idle几秒钟,等待原EXE的退出(或者你在原EXE文件退出前向副本进程发送某条自定义消息以通知副本则更好)。
    4、之后副本删除原EXE文件(你可以在命令行中传递原EXE文件的路径),由于此时原EXE进程已退出,该文件已解除锁定。
      

  18.   

    TO:DeityFox(神狐) 当然可以!用api函数进行copy,然后删除自己  不就是这个意思?
    其实偶们都理解错了,偶上面这句化的意思就是这样,而你们理解成"覆盖正在运行的的程序"
       哈哈!当然你怎么说都可以拉!我们又不是你肚子里的蛔虫,怎么会知道你老人家简单的一句话会包含如此深奥的道理呢!不过我相信如果没有你后面的解释,十个看的人里有八个都会和我一样看不懂!   哈哈哈哈!
      

  19.   

    已经实现此功能。
    美中不足的是:
    1 2_1.exe不能启动太快,得让2_0.exe完全退出才行。
    2 更新后的程序运行后,不能处于最大化状态。
      

  20.   

    TO: rushing(勇敢的心) 
      1、最好是通过 SuB Main 启动,这样2_1.exe启动后,可以在内存中查找2_0.exe是否完全退出了,如果是,再开始复制,不是则等待;
      2、不理解你的意思,为什么不能最大化?
      

  21.   

    1 怎样检测2_0.exe是否完全退出了?
    2 已经解决,是shell的问题。
      

  22.   

    http://www.csdn.net/Expert/topic/449/449418.shtm
    去那里看看有TTs的控件
      

  23.   

    修改注册表:RunOnce,
    等系统下次启动
    或参照罗云彬网站上的自己删除自己的一段小代码
      

  24.   

    RunOnce是做什么的?
    是在Windows 下的那个吗?
      

  25.   

    可以用SDK函数CopyFile(LPSTR OldFilePathName,LPSTR NewFilePathName,BOOL )
    这个函数可以复制自身。具体可查找MSDN
      

  26.   

    在C:\根目录下新建一个wininit.ini文件,写入:
    filename1=filename2……
    就搞定了!!
      

  27.   

    看了那么多,只有 thirdapple(第三只苹果) 的方法可行。
    还有一个方法,是在 LU0的主页上发现的,可以在程序中用一小段汇编程序关闭自己文件的句柄,然后就可以为所欲为了。不过我没试过。
      

  28.   


    to:runrunrun(一条不会游泳的鱼) 贴出来,送你200分!!!