lu:多个应用程序框加需在不同的线程空间内,才能同时运行其各自的Thread->Run();如果在同一个线程空间内运行Thread->Run(),这些程序框架的Thread->Run()会产生冲突. 本方法可轻易地实现把不同的软件系统集成在一个内存空间,只要把我们开发的应用软件封装在各自DLL内,统一有一个主程序调用装载,所有的软件系统都共享内存,不需要其他高深的知识,并且我们可在一个主程序启动后再选择启动那个分系统.
(发表于2002-10-19 9:27:00)
LEAF:好象少了一个头文件!
(发表于2002-10-25 20:11:00)
lu:你的VC的INCLUDE 目录配好了吗
(发表于2002-10-29 8:12:00)
l:把我们的应用程序框架开发成常规动态连接库DLL(*.DLL)的形式,而不作为独立的应用程序*.EXE文件,然后在一个主程序中装载若干多个这些应用程序框架DLL,这样轻易实现多个应用程序共享内存,并且可有一个主程序来选择要起动的软件系统,当然得把这些系统放在不同的线程空间内装载,他们处在不同的线程空间的,但重要的是可轻易地共享内存了,不再需要其他应用程序共享内存的复杂的方法了,并且对用来进行应用软件(象AutoCAD等)的二次开发很有价值,你可把二次开发集成进一应用程序框架软件系统内,再由主程序装栽进入其内存空间,通过二次开发集成软件系统控制主程序,而不再象以前的二次开发只是离散地扩充原主程序的命令函数不成独立系统.
(发表于2002-11-1 16:44:00)
liron:本例子程序编译后生成dll.dll和DllTest.exe,必须把dll.dll和DllTest.exe放在同一个目录,执行DllTest.exe,其装载dll.dll内程序框架.
(发表于2002-11-1 16:45:00)
lir:还需加一句:多个应用程序框加需在不同的线程空间内,才能同时运行其各自的Thread->Run();如果在同一个线程空间内运行Thread->Run(),这些程序框架的Thread->Run()会产生冲突.
(发表于2002-11-1 16:45:00)
kk:用这种方法,大家再发挥一下,就能很容易地实现多个应用程序共享内存空间
(发表于2002-11-1 16:45:00)
liron:我以前在网上找相关的主题,都没有人论及在动态连接库内封装应用程序的方法,甚至国外有一个原代码网站说不可能实现,只替供给大家在动态连接库内封装Docment/View的结构,不能完全封装程序框架,我比较了MFC程序DllMain和WinMain的不同之处,并研究了线程空间的机理,然后用变通的办法实现了把应用程序框架封装在DLL内.
(发表于2002-11-1 16:53:00)
liron:把我们的应用程序框架开发成常规动态连接库DLL(*.DLL)的形式,而不作为独立的应用程序*.EXE文件,然后在一个主程序中装载若干多个这些应用程序框架DLL,这样轻易实现多个应用程序共享内存,并且可有一个主程序来选择要起动的软件系统,当然得把这些系统放在不同的线程空间内装载,他们处在不同的线程空间的,但重要的是可轻易地共享内存了,不再需要其他应用程序共享内存的复杂的方法了,并且对用来进行应用软件(象AutoCAD等)的二次开发很有价值,你可把二次开发集成进一应用程序框架软件系统内,再由主程序装栽进入其内存空间,通过二次开发集成软件系统控制主程序,而不再象以前的二次开发只是离散地扩充原主程序的命令函数不成独立系统.
在通常情况下VC不提供开发动态连接库封装程序框架的功能,须对MFC的内部机理有较好的理解,对动态连接库的DllMain和MFC的常规应用程序的WinMain的区别理解,对线程空间的概念理解后才能做到,
(发表于2002-11-1 16:54:00)
sans:
(发表于2002-11-1 16:55:00)
Lgy:嗯,这个想法确实不错。
(发表于2002-11-15 10:11:00)
Binny:good
(发表于2002-11-28 11:53:00)
liron:现在:
(发表于2002-11-30 13:29:00)
liron:在动态库内封装框架,其不同于封装普通的界面控件,普通的界面控件没有独立的线程和消息循环,没有独立的线程空间,其空间是在调用他的主程序空间内,而MFC的应用程序框架是有其独立的线程空间的,并且有其消息循环,在MFC的应用程序中,这一切已全被封装在MFC中,但如想把该应用程序框架封装到常规DLL内,就会有一个问题出现,就是MFC的应用程序的WinMain和Dll内的DllMain代码是不同的,DllMian内没有设置线程消息循环,
你可以打开MFC原码一看便知,这样一来常规DLL内的CWinApp实例和MFC应用程序框架内的CWinApp实例的行为是不同的,如果把程虚框架封装在DLL内后,不修改常规DLL内的CWinApp实例的行为,那么这个常规DLL内程序框架就会有异常,该框架的CWinApp实例空闲函数OnIdle(...)不会运行,并且工具条ToolBar在浮动状态时单击有上角的 "x "无法关闭工具条, 还有其他很多的BUG
(发表于2002-11-30 13:33:00)
liron:大家在我提供的代码中,把Thread- >Run()注释掉,看看会有什么结果,就会有上面的BUG,
我所说的程序框架,并不仅指CDocManager,CDocment,CView等,而是整个MFC应用程序的框架结构,其包括CWinApp,CDocment,CView,CmainFrame的整个搭配,
其实这是很早就已实现的,微软Word,Excel,AutoCAD2002等内嵌了一个VB宏编译器,打开这个VB宏编译器就出现一个完整的独立的IDE界面环境,这个独立的IDE界面就是一个完整的程序框架,他是在主程虚的内存空间内,并有其独立的线程空间,这个VB宏编译器内的宏代码通过COM控制主程序(因为与主程序不在同一个线程空间,所以不是直接调用主程序内的函数控制主程序,我想微软为什么不提供这种调用就是这个原因),
(发表于2002-11-30 13:33:00)
liron:要把一个应用程序的主窗口当作别的窗口的子窗口,可用上面的方法,把这个应用程序封装到DLL内,在另一个界面程序中装在该DLL后,把主程序的界面窗口设为DLL内程序主窗口CMainFrame的父窗口,其他控制也很容易了.
系统实现(动态加载),但要看是进程内加载还是进程外加载,所有windows下的应用程序全都是被windows操作系统动态加载的,所有的用户应用程序都是在windows操作系统核心态基础上实现的用户态程序;API函数中有几个函数可远程启动其他应用程序,是进程外的启动,就是说被启动的应用程序与启动的应用程序不在同一个进程空间内,如何把不同的应用程序加载进同一进程空间,希望大家来探讨更多的方法。
(发表于2002-11-30 13:34:00)
zhyzmx:这种方法是不是将现有应用程序以.DSP的形式插入常规DLL工作区中?如果是这样,那么应用程序中的CWinApp类与DLL中的CWinApp类如何处理?如果简单插入就不能生成
DLL,而是生成EXE文件。请仔细讲一下插入方法好吗?
急盼!!!
(发表于2003-11-11 15:39:00)
sinall:做的很好,但是,我现在没法用,没有那个头文件
(发表于2004-9-30 9:26:00)
sinall:可以用了,把那个头文件注释掉就OK拉,^_^
另外,那个Dlltest_link是做什么用的呢?
(发表于2004-9-30 9:31:00)
jessicalsk:小弟初学,请大家详细说一下,,谢谢,,
楼上大哥说把头文件注释掉就好用了,,可我的不好用啊,,注释掉之后,显示下一个头文件错误,,当把下一个注释掉的时候,显示LINK : fatal error LNK1104: cannot open file "acad.lib"
Error executing link.exe.
请问是什么原因啊
(发表于2006-5-31 10:08:00)
..........................................................................
--------------------next---------------------