当前位置:编程学习 > VB >>

非常急!!如何在form1框架里面添加exe程序。

有一现成程序(除了exe文件外还有dll、dat文件),为了想要那个程序的功能,现在唯一办法是把exe嵌入到form去来展示效果。
寻求详细添加的步骤及代码。

万分感谢。

请不要复制百度上的内容,我已经全部找遍了,都没有科学的解决方法。 --------------------编程问答-------------------- 这是不现实的,要别的程序的UI显示在自己的窗体里面并不难,但是你的程序却无法与现成的程序进行交流,包括数据和功能的交流。举个例子,你想要某个软件的绘图功能,你希望你的程序提供数据给这二个程序,然后这个程序绘好图之后将图像数据返回到自己的程序,或者直接显示出来,这样是做不到的。即使做到,要不就是使用内存和线程注入之类的手段,非常麻烦;另外一种有可能的,但是支持这种技术的程序不多,那就是OLE。

如果现成的程序是OLE服务器,那你就可以通过OLE技术在VB中添加对他的引用,从而像操作对象一样通过代码操作那个软件。举个例子,Word,你可以在VB的【引用】窗口将Word.exe,即Word的程序添加进来,然后利用其中提供的Application,document等对象操作Word。这是因为Word的程序本身是OLE服务器,他提供程序与程序之间的功能和数据的交流接口。可以尝试在VB的【引用】窗口单击浏览,找到exe之后尝试把他加进来,如果可以则这个exe很有可能是OLE,如果提示不能加载就肯定不是OLE

不过,如果你说我只要把现成的那个软件的界面嵌入到自己的窗体里,不需要功能和数据的交流,这个就好实现。思路如下:

①首先你需要一个“句柄查询器”,百度搜索这个词有一堆
②启动你现有的软件。例如你要把这个软件的“ABC[xxx]”窗口嵌入你的程序里,就用那个句柄查询器去捕获这个窗口(句柄查询器的基本用法,按住一个按钮不放,然后移动鼠标到需要的窗体上,查询器就会自己去查那个窗口的资料了,找到没这功能的就换一个吧)。查看那个窗口的类名,这才是1,2部最主要的目的。
③在自己的程序里声明API函数findwindow函数(具体的声明百度“findwindow”)
④调用findwindow函数传入之前查到的类名作为参数,这个API函数可以找到符合你所给的类名的窗口,并返回这个窗口的句柄。查看返回来的句柄是否和查询器查到的一样,一样的话就可以往下做了。
⑤在自己的程序里声明API函数SetParent函数(具体的声明百度“SetParent”)
⑥调用SetParent函数,将自己的窗口的句柄(例如窗口Form1的句柄就是Form1.hwnd属性的值)和拿到的句柄作为两个参数传进函数,就可以重设“ABC[xxx]”窗口的父窗口为你自己的窗口。这样“ABC[xxx]”窗口就嵌入到你的窗口了。

基本上就说这些,不过觉得你要的应该还是两个程序有数据或功能上的交流,因为你说“为了想要那个程序的功能”,那如果不是OLE的话就放弃吧,基本上没办法,或者坐等更高级的大神了~~ --------------------编程问答--------------------
引用 1 楼 JiLuoXingRen 的回复:
这是不现实的,要别的程序的UI显示在自己的窗体里面并不难,但是你的程序却无法与现成的程序进行交流,包括数据和功能的交流。举个例子,你想要某个软件的绘图功能,你希望你的程序提供数据给这二个程序,然后这个程序绘好图之后将图像数据返回到自己的程序,或者直接显示出来,这样是做不到的。即使做到,要不就是使用内存和线程注入之类的手段,非常麻烦;另外一种有可能的,但是支持这种技术的程序不多,那就是OLE。

如果现成的程序是OLE服务器,那你就可以通过OLE技术在VB中添加对他的引用,从而像操作对象一样通过代码操作那个软件。举个例子,Word,你可以在VB的【引用】窗口将Word.exe,即Word的程序添加进来,然后利用其中提供的Application,document等对象操作Word。这是因为Word的程序本身是OLE服务器,他提供程序与程序之间的功能和数据的交流接口。可以尝试在VB的【引用】窗口单击浏览,找到exe之后尝试把他加进来,如果可以则这个exe很有可能是OLE,如果提示不能加载就肯定不是OLE

不过,如果你说我只要把现成的那个软件的界面嵌入到自己的窗体里,不需要功能和数据的交流,这个就好实现。思路如下:

①首先你需要一个“句柄查询器”,百度搜索这个词有一堆
②启动你现有的软件。例如你要把这个软件的“ABC[xxx]”窗口嵌入你的程序里,就用那个句柄查询器去捕获这个窗口(句柄查询器的基本用法,按住一个按钮不放,然后移动鼠标到需要的窗体上,查询器就会自己去查那个窗口的资料了,找到没这功能的就换一个吧)。查看那个窗口的类名,这才是1,2部最主要的目的。
③在自己的程序里声明API函数findwindow函数(具体的声明百度“findwindow”)
④调用findwindow函数传入之前查到的类名作为参数,这个API函数可以找到符合你所给的类名的窗口,并返回这个窗口的句柄。查看返回来的句柄是否和查询器查到的一样,一样的话就可以往下做了。
⑤在自己的程序里声明API函数SetParent函数(具体的声明百度“SetParent”)
⑥调用SetParent函数,将自己的窗口的句柄(例如窗口Form1的句柄就是Form1.hwnd属性的值)和拿到的句柄作为两个参数传进函数,就可以重设“ABC[xxx]”窗口的父窗口为你自己的窗口。这样“ABC[xxx]”窗口就嵌入到你的窗口了。

基本上就说这些,不过觉得你要的应该还是两个程序有数据或功能上的交流,因为你说“为了想要那个程序的功能”,那如果不是OLE的话就放弃吧,基本上没办法,或者坐等更高级的大神了~~

夜里写了这么多辛苦啦。

我不是想实现我的程序里能直接使用它功能。

只是直接加了个外壳而已,仅此这样。 --------------------编程问答-------------------- 那就听1楼的SetParent一下吧,同时注意一下当主窗体改变大小时子窗体也匹配好,以及主窗体关闭时通知子窗体关闭 --------------------编程问答-------------------- 帖主莫非要在VB.Form里面实现一个WindowsXP虚拟机?!
--------------------编程问答-------------------- VB控制外部窗口为自己的子窗体
是这个意思吗 --------------------编程问答--------------------
引用 5 楼 dxd0128 的回复:
VB控制外部窗口为自己的子窗体
是这个意思吗


就是这个意思。
求解决方案。

对方程序是exe文件跟dll文件。。我用资源管理器生成RES后怎么释放出来 --------------------编程问答-------------------- --------------------编程问答-------------------- 那就听1楼的SetParent一下吧.

自己就一个MDIFORM,把EXE窗口当成子窗口放进来就OK了。 --------------------编程问答-------------------- 没有你说的那样的功能,你可以在窗口里面放网页,放flash,但就是放不了应用程序, --------------------编程问答--------------------
引用 6 楼 zhail 的回复:
.......

对方程序是exe文件跟dll文件。。我用资源管理器生成RES后怎么释放出来


在资源编辑器中添加‘自定义资源’就可以把那些 .exe、.dll加到里面去了。
然后你的程序启动后, LoadResData()到动态字节数组中。
从 字节数组 写到磁盘文件,用Binary模式写,这个你没问题的吧。
把那些文件都写到同一个文件夹中,就可以Shell来运行它了。
(如果它原来还有一些子目录和子目录内的文件,要注意‘相对路径’跟原来一样就行)
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,