使用VB6.0,win2000,win98,winxpSp2
如题,对程序的主exe进行版本更新,就一个文件要更新。原程序代码中有连接网络数据库,程序在运行中,打开版本更新,使用FindWindow检查程序是否正在运行,检查到的话,用PostMessage关闭它,然后使用CopyFile对原EXE文件从网络中进行覆盖拷贝。问题是,copyfile有时返回True,表示拷贝成功,但有时返回False,没有进行拷贝。想知道原因,显然,我先可以排除文件只读和权限问题,也可以排除网络问题。问题也许就处在PostMessage上,对一个已经打开,并且有连接Oracle数据库的进程或程序,用PostMessage关闭它后,是否可以直接用CopyFile覆盖?当然,也可能是其他方面的问题,大家集思广益,我会及时对大家的方法进行测试和告知结果,感谢大家,望多多参与。

解决方案 »

  1.   

    当然,可以有很多现成的办法解决,比如把CopyFile套在一个循环中,只有返回True时,才跳出循环,但,我要知道原因,为什么CopyFile返回False,科学,是讲究理由的。
      

  2.   

    还有,PostMessage换成SendMessage,同样有问题。但,当我在使用CopyFile前,让程序暂停1秒或几秒,那结果大致上都返回True,表示拷贝成功。但,显然,我只测试了10来次,并不能以此来解决问题。还是想知道原因,这样,解决问题就是一劳永逸了。
      

  3.   

    大家来说说吧,就当测试下VB和api水平了。
      

  4.   

    你不觉得自己的作法颠三倒四的吗?既然主程序检测到了有更新,自己需要关闭,那你为什么用UPDATA程序去关闭主程序,主程序调用更新程序后自己关闭不好吗,非要用API啊?另外,你主程序退出的时候是不是有对象没有释放?
      

  5.   

    让主程序自己检测到新版本后关闭,然后执行update程序,update完成后再调用主程序,似乎不需要api
      

  6.   

    ???????????????
    你用的copyfile是api还是自己写的函数还是fso里的方法?????
    如果是api,返回值应该是long(非0表示成功)而不是boolean,而且会设置GetLastError,用GetLastError应该可以得到错误信息........
    另外,请看看bFailIfExists参数的设置.......
      

  7.   

    终于有人了。
    因为在以前做的时候,没有考虑要在线更新。所以,这次额外做了个EXE,负责更新。