起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 365|回复: 16

调用exe程序

[复制链接]
发表于 2010-4-7 08:42:09 | 显示全部楼层 |阅读模式
我系统有个功能需要调用已经安装的exe程序来实现

我是想让这个exe程序运行在平台的一个form中  而不是单独在平台外面打开一个窗口

这个能否实现?
回复

使用道具 举报

发表于 2010-4-7 10:27:46 | 显示全部楼层
实现不了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-7 11:10:11 | 显示全部楼层
这个一点思路都没有么?
我就让这个exe程序在平台里的一个form里运行
回复 支持 反对

使用道具 举报

发表于 2010-4-7 11:23:13 | 显示全部楼层
有这样一个思路你可以试试,不知道能不能行:
windows好像有个叫setparent的api函数,能够设置某个句柄的父,
那么看看这个函数里面的参数是什么,如果可以传入一个句柄,那么就想办法使用api得到你那个exe的主窗体,然后指定成自己的主窗体。
可以现在delphi中试试,我们这没有delphi
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-7 11:41:22 | 显示全部楼层

好的  谢谢了
回复 支持 反对

使用道具 举报

发表于 2010-4-7 14:18:04 | 显示全部楼层
这种需求逻辑上是可以实现的,但比较麻烦,其核心调用函数就是
windows.SetParent(FormHandle, newParentHandl);
第一个参数是被设置窗体的Handle第二个是父控件的Handle,
Borland.Delphi.Windows.FindWindowA('TForm1', 'Form3');可以得到第一个参数,这个函数可以得到第一个参数(与Delphi不同,这里第一个参数不支持nil,Delphi中传nil会忽略这个参数搜索,平台只能传正确的类名(可以通过spy++之类的程序得到类名)当然也可以自己包装一下delphi中的函数来使用,否则不能找到正确的窗体),第二个参数就是平台里头想放置窗体的那个控件的句柄。
通过这个参数设置后,就可以实现把任何windows窗体显示在x3的平台中,但注意这样显示进来后,依旧是个窗体,而不会跟当前的窗体融合到一起。想要真正融合到一起还要结合SetWindowsLong这样的API去设置得到的窗体的参数才行。这样做可以融合一个已知的窗体,但如果这个窗体还会创建弹出窗体,那弹出窗体会游离于融合体系之外(要对弹出的窗体,另外做融合才可以,自然有可能通过Hook技术把新创建的窗体搞进来,但我并没有做过试验)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-7 14:24:55 | 显示全部楼层
感觉好复杂
回复 支持 反对

使用道具 举报

发表于 2010-4-7 14:48:50 | 显示全部楼层
确实:逻辑上可以实现的,但比较麻烦,但其核心调用只有一个API,就是SetParent,其它的调用或者是围绕着这个API展开,或是围绕着需求展开的。
回复 支持 反对

使用道具 举报

发表于 2010-4-7 19:12:56 | 显示全部楼层
能否用ole控制exe程序呢?
回复 支持 反对

使用道具 举报

发表于 2010-4-8 09:43:11 | 显示全部楼层
不一定,取决于exe本身是否支持那样调用。比方说word, Excel,写字板之类的是最标准的支持的,而记事本,或自己随便用Delphi写一个简单程序就是不支持的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-10 07:06 , Processed in 0.043803 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表