800分求教运行时动态重定向输入问题,请各位帮忙 ( 积分: 200 )

  • 主题发起人 主题发起人 huangxw2003
  • 开始时间 开始时间
H

huangxw2003

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:如何在程序运行时动态重定向(有例子更好C、DELPHI都行啊,如果没有有思路也行啊)
解释:我有一个程序,在运行时要大量输入信息(每天都不一样),输入完这些信息后,又要求用户手动输入。解决思路是,程序在命令行输入 MYCMP < DATA.DAT,是重定向输入为从文件输入,如何在需要的时刻重定向输入到键盘,请各位帮忙!
==========
其它:MYCMP的程序已存在,不容易修改,最好可以有外部程序可以动态修改MYCMP的重定向输入到键盘;
 
问题给出的积分错误,才200分,解决后另开帖一定奉上
 
是WINDOWS环境下的,只要求在WIN2000/XP下,如果WIN98下有就更好了
 
MYCMP < DATA.DAT 是现在已经支持的功能了吗?
还是说本来没有这功能,要实现这样的功能?

可参考一下CreateProcess的STARTUPINFO参数
 
MYCMP < DATA.DAT 是可以使用的,但如果用重定向后,可以从DATA.DAT 输入数据,但输入数据后,无法切换为键盘输入。我的需要是如何在运行时,在需要的情况下切换为键盘输入。用 CreateProcess 建立子进程,用 PIPE 管道的方法,我也试过了,依然无法动态切换。
我需要的主要是在指定的条件下切换到键盘输入的功能。最好是在不修改或少修改原程序的情况下,可以另编写一个有外部程序可以动态修改MYCMP的重定向输入到键盘。
 
明白你的意思了,你是说有一部分数据是从DATA.DAT中输入的,另一部分又要用户从键盘输入
相当于你要写一个辅助输入程序,在用户进行输入前自动把Data.dat中的内容帮用户输入,然后再交给用户处理。
可以换一个思路来做,一样打开MYCMP的正常界面,然后你的程序从Data.dat中读取数据,并发送到MYCMP的命令行界面中,发送完后用户继续工作。
 
xianjun,我也思考过你的思路,但有以下情况不允许
时间问题
从DATA.DAT中输入的数据是另外一个程序产生的,数据量很大,MYCMP 需要处理。我试验过了,用自己的程序读取后,用keybd_event来发送,如果不要延时一直发送,会出现输入数据丢失的现象;如果采用延时 SLEEP(1) ,输入数据不会丢失,但时间太长,大概所用时间是采用MYCMP < DATA.DAT 的 100 多倍,这一方案昨天已经被否决了。不知系统在处理 MYCMP < DATA.DAT 时是如何保证输入数据不丢失的
 
你再试试用如下办法:
用 keybd_event
但不是用它来直接发送数据,数据在剪贴板中,keybd_event只是发送Ctrl+V(或其他相应的热键)
直接用 keybd_event 发数据是很慢的。
 
xianjun,我试了,不行,MYCMP运行后新开一个类似DOS的黑窗口,CRTL+V无法黏贴数据,出现 ^V 符号。如果有快速输入数据的方法也好啊。
 
MYCMP是交互运行的吗?也就是说用户输入一项它会提示别外的信息让用户继续输入?
如果只是说用户可以不分格式按顺序直接输入的话,那你是不是可以自己的程序做用户输入界面,然后生成Data.dat文件,再调用MYCMP < Data.dat导入?

DOS窗口下当然不能直接用Ctrl + V了,但一般可以用 mouse_event 发送鼠标右键(如果有弹出菜单,再用Keybd_event发送一个P即可)
 
谢谢xianjun,高手啊,经验很丰富啊
1、MYCMP必须交互运行,用户要使用前面输入的信息的反馈,来决定如何处理
2、MYCMP无鼠标菜单
还是没解决,不过还是要谢谢你了
 
如果能动态重定向就好了
 
动态重定向没有试过,不知可不可以,但你可以把那个程序的输入、输出都由自己的程序来处理。相当于是给MYCMP做了一层外壳,这个可能就稍微麻烦一些了,因为所有东西自己处理,稳定性什么的要花点心思。
你可以看一下我以前写的一些代码:
http://xianjun.vicp.net:8080/temp/Old/Redirect.rar

http://xianjun.kmip.net:8080/temp/Old/Redirect.rar
 
我现在就是自己写个外壳来处理,就是输入的速度太慢了,启动所需要的时间太长了。个人觉得用动态重定向是最好的方案,可惜自己能力有限,达不到。谢谢xianjun兄了,
 
据我的经验,这个外壳应该是不慢的,是不是哪里出问题了?
你可以试一下我上面的代码。执行 Redirect.exe
然后在下面的ComboBox中输入 E:/xxx/MyCMP.exe
然后再在ComboBox中根据上面的输出结果输入数据,试试速度。
不能直接在界面上的Memo中直接输入,程序不会处理的。
 
PS: 这个例子其实就是用了你说的所谓重定向。
你看看uRedirect.pas单元里面的代码就知道(一个输入、两个输出都重定向到自己创建的管道中,这样才可以直接获取你那程序的输入、输出):
STARTUPINFO.hStdInput := FPipeInput.hRead;
STARTUPINFO.hStdOutput := FPipeOutput.hWrite;
STARTUPINFO.hStdError := FPipeError.hWrite;
 
xianjun兄,用 CreateProcess 建立子进程,用 PIPE 管道的方法,我也试过了,依然无法动态切换。输入的速度我再试试看,原来是输入速度太快会丢数据,延时输入不会丢数据,但又太慢
 
用管道输入也会出现速度太快丢失数据的问题吗? 这个就要跟踪一下看是什么问题了。
 
用管道输入的问题是
1、要作为子进程运行,这个还好,可以将子进程隐藏或要求用户不要随便关闭父进程
2、用管道输入可能缓冲区还是有一定的大小,输入太快还是会出现输入数据丢失。

最后的解决办法还是用原来的方案,用 keybd_event 发送,自己编写延时程序,经调整延时时间到保证不丢失数据的情况下,程序启动时间到达1.5分钟,勉强可以。

虽然没有解决,但还是很感谢 xianjun 兄的指点,送上 200 分,对 xianjun 的帮助表示感谢
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部