如何把一个应用程序嵌入到另外一个应用程序

shaohui 2006-12-14 07:00:08
我想把一个应用程序嵌入到另外一个应用程序.比如说,我想开发一个有多个tab的应用程序,而其中每一个tab标签运行一个已经开发好的应用程序,比如记事本.那么我就可以像FireFox那样打开一个窗口而有不同的tab,每个tab里面都运行一个记事本程序.另外还有一个问题就是,要在不修改被嵌入的应用程序,不知道有没有比较好的办法,是否是用ActiveX,谢谢.
...全文
1350 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaohui 2006-12-18
  • 打赏
  • 举报
回复
re:jjwwang
OleContainer应该是行不通的,OLE只能包含文档对象,对于其他应用程序好像不可以哦
cczlp(不惑) 说得很详细,谢谢
pp616 2006-12-17
  • 打赏
  • 举报
回复
目前没有bcb环境。有机会一定要写个demo试下。
sczyq 2006-12-17
  • 打赏
  • 举报
回复
to: pp616(傻小子)

在含MDI的DLL中,若不进行如下处理,肯定出错,原因就是DLL也有Application之故!

TApplication *DllApplication = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
DllApplication = Application;
if (reason == DLL_PROCESS_DETACH)
Application = DllApplication;
return 1;
}
CACACACACA 2006-12-17
  • 打赏
  • 举报
回复
不知楼主的具体情况.
楼上说的很详细了.
OleContainer也可试试.
cczlp 2006-12-17
  • 打赏
  • 举报
回复
keiy() 说的基本没错,只是可能对某些程序不适用。
对于记事本和画图这样简单程序,还是可以的。

可以试一下,窗体上加一个PageControl,建2个Page,启动记事本和画图,移动到左上角,执行:

HWND hwnd1 = FindWindow("Notepad", NULL);
if (hwnd1 != NULL)
{
::SetParent(hwnd1, PageControl1->Pages[0]->Handle);
}

HWND hwnd2 = FindWindow("MSPaintApp", NULL);
if (hwnd2 != NULL)
{
::SetParent(hwnd2, PageControl1->Pages[1]->Handle);
}
pp616 2006-12-17
  • 打赏
  • 举报
回复
"而且采用动态调入一个DLL文件,同样也会在内部产生一个 Application"

调入dll只是把dll装入内存,然后把那段物理内存映射到EXE的进程空间内,DLL本身并不分配地址空间的。如何内部产生一个Application???
shaohui 2006-12-17
  • 打赏
  • 举报
回复
Great, 谢谢,keiy和daydayup234
我回去试一下.
sczyq 2006-12-17
  • 打赏
  • 举报
回复
keiy() 的办法实现起来肯定有问题。

因为,每一个CreateProcess 调用一个 exe ,肯定会产生一个 Application, 而且采用动态调入一个DLL文件,同样也会在内部产生一个 Application,关键是这两个(主程序与被调用的)Application之间如何切换,若切换不正确,产生的错误可能会导致系统崩溃。

因此,采用同一种开发工具、采用DLL方式调入,肯定是首选。

daydayup234 2006-12-16
  • 打赏
  • 举报
回复
keiy的方法已经充分了

也可以调整思路,尝试一下:
1 一个exe,多个dll 或者
2 在"主" exe的res资源文件“加入” 各个“分”exe
柯本 2006-12-16
  • 打赏
  • 举报
回复
再看了下楼主的要求,事实上是我理解错了,我以为是要将当前应用嵌入到其它应用中,而楼主的要求是将其它应用嵌入到当前应用中,这个理论上应该可以的
1.在当前应用建多个窗口(只要有句柄的窗口就可以了,如TPenl就可以)
2.用CreateProcess运行要嵌入的应用
3.得到嵌入应用主窗口的Handle(可用EnumThreadWindows/GetTopWindow)
4.将嵌入应用主窗口的父窗口指向1的窗口( SetParent)
5. 调整嵌入应用主窗口的大小位置(SetWindowPlacement)
6.重复2-5
我只是大概提供了一个思路,其实楼主做的,类似Exlporer(桌面)

wz 2006-12-15
  • 打赏
  • 举报
回复
shaohui 2006-12-15
  • 打赏
  • 举报
回复
哦,其实我是想把putty嵌入到另外一个程序中,这样的话就可以有一个多窗口的putty了,当然没有什么插件了.其它程序也类似,不知道有没有现成的控件可以完成这个.
谢谢keiy.
zyyoung 2006-12-14
  • 打赏
  • 举报
回复
activx
柯本 2006-12-14
  • 打赏
  • 举报
回复
1.如果你的应用程序类似IE等支持插件的话,没任何问题
2.用线程注入技术,这个有难度,网上有一些资料,查一下
3.用HOOK技术,可能对某些应用有用
想不到其它的方法(你的应用与ActiveX不一定有关)

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧