vfp 与 com组件 的迷惑!

vfp 与 com组件 的困惑!!
        用vfp9.0做的一个C/S系统,有一个模块需要采用FTP方式下载文件,文件大小在一般在(几百K ~ 4M)之间,由于vfp的单线程特征,所以整个下载过程,主界面是处于“瘫痪”状态的(不知道“瘫痪”一词是否恰当,姑且这么说吧,总之是停止一切响应。)

        我的理想:
         
        能不能在主界面发出下载需求后,交由一个后台运行的“组件”去完成下载工作,主界面该干嘛干嘛,后台“组件”下载完成后再通知主界面。
        这对于自动更新程序也很有用:主进程发现新版本——> 通知后台“组件”下载 ——> 下载完成通知主进程。

        我的尝试:

        把FTP下载代码做成了一个“进程外组件”(exe),我以为“进程外组件”是独立于主进程运行的,相对于主进程应该算是另外一个进程了吧(这种多进程是不是变相实现了多线程呢),没想到:当主进程(主界面)调用这个专施下载之职的“进程外组件”后,整个下载过程,主界面仍然是“瘫痪”状态,非得下载完成后,主界面才“活”过来,而且下载过程中如果主界面有用户操作,比如移动一下主界面,首先这一操作无法响应,其次还会弹出一个讨厌的对话框:

vfp 与 com组件 的迷惑!

      请教各位大侠:这是怎么回事?有没有现在的,成熟的解决方案?
------解决方案--------------------
做成 com 应用(dll)
------解决方案--------------------
引用:
Quote: 引用:

你思路没有问题,问题应该出在调用代码上,也就是一直等待调用结果返回,所以造成假死。
说明一下你是如何调用的吧。
我建议用消息方式调用,用 PostMessage API


感谢十豆三老师回复!多次得到您的帮助,为您的热心和技术点赞!

一、我先将FTP下载控件(ocx)做成类,然后连编时选择Win32可执行程序/COM服务程序(exe),做成进程外组件(exe)。

二、新建一个项目,做了一个表单,调用如下:

oFtp = Createobject("myftp.myftp")
oFtp.cFtpPathName = ALLTRIM(thisform.text1.Value)    && cFtpPathName是myFtp组件的一个属性,指定要下载的远程文件路径
oFtp.DonwFile()   && DonwFile() 是一个自定义方法,下载cFtpPathName属性指定的文件
=MESSAGEBOX('下载完成')
oFtp = NULL
RELEASE oFtp

        这样调用问题出在哪里了?请大侠明示。

还有 ,用 PostMessage API 消息调用我一点也不会。能请大侠指导一下吗?

这样调用肯定有等待机制,建议把你的下载程序做成单独的EXE,然后开机后运行或者你的主程序调用运行:Run /N4 下载程序.exe,启动后隐藏。
然后需要下载时你的主程序发消息给下载程序
Declare Integer FindWindow In WIN32API String lpClassName,String lpWindowName
Declare Integer PostMessage In WIN32API Integer HWnd,Integer wMsg,Integer wParam,Integer Lparam
lnHWnd=FindWindow(Null,'下载程序的窗口Caption')
If lnHWnd>0
=Strtofile(ALLTRIM(thisform.text1.Value),'DFile.txt')
PostMessage(lnHWnd,1044,0,0)
Endif

下载程序建自定义方法,MyMessage
Lparameters tnHWnd,tnwMsg,tnwParam,tnLparam
If tnHWnd=This.HWnd And tnwMsg=1044
lcFile=Filetostr('DFile.txt')
*然后将 lcFile 给 cFtpPathName,开始下载,下载成功后,再通过 PostMessage 给主程序一个成功消息,方法相同不再介绍。
Endif