📄 subject_17187.htm
字号:
<p>
序号:17187 发表者:lirong 发表日期:2002-10-09 11:50:17
<br>主题:如何在常规动态连接库内封装应用程序框架
<br>内容:MFC常规DLL内有一CWinApp实例,同MFC EXE应用程序,用Wizard生成一常规DLL和一MDI或SDI应用程序,把应用程序中的CAppDocment CAppView CMainFrame和../res/目录下的资源,及<BR>*.rc资源拷贝到常规DLL工程目录内,用VC编译器打开常规DLL项目,把以上拷贝内容添加到常规DLL项目内,修改常规DLL内CDllApp::Instance函数,按MDI或SDI应用程序内CWinApp::Instance()函数内容修改,编译DLL就封装了应用程序框架,<BR><BR>在另外一个应用程序中装载该DLL的方法:因为MFC的SDI和MDI应用程序,其内封装了AfxWinMain()函数,而常规DLL内封装了DllMain()函数,两者都在CRT的_CRTStartMain()函数内调用启动程序,通过分析DllMain和AfxWinMain函数差异,发现DllMain内没有该句:<BR>pThread->Run();(CWinThread *pThread),因此为了在其他应用程序中装载该DLL,并启动DLL内的程序框架,并使其能正常运行,必须在显式装载该DLL后取的DLL内的线程指针,可通过DLL的输出函数输出(CWinThread *pThread=GetCurrentThread();),在应用程序中显式调用pThread->Run();但为了使DLL内程序主线程pThread->Run()和本应用程序AfxWinMain内<BR>的pThread->Run()(封装在MFC框架内)不发生冲突,应在本应用程序内启动一个线程,在该线程函数内调用DLL内的主线程pThread->Run();这样就在一个应用程序内通过调用常规DLL的方式启动另外一个封装在该常规DLL内的程序框架了,并且两个应用程序框架处于同一内存空间.
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:徐景周 回复日期:2002-10-09 11:59:05
<br>内容:用MFC的程序向导生成一个常规DLL,在常规DLL内有一派生自CWinApp的实例,再用MFC的程序向导生成一个MFC<BR>EXE应用程序,把MFC EXE应用程序中<BR>CAppView,CMainFrame,CAppDocument的文挡和RES目录下的资源拷贝到常规DLL项目中,添加到项目中,编译生成一DLL,在另外一个WIN32应用程序中,启动一线程,在线程函数中显式装载该DLL,取的该DLL内的当前线程,<BR>CWinThread *pThread=GetCurrentThread();<BR>pThread->Run();<BR>就可装载启动常规DLL内应用程序框架.<BR><BR>可参看下面网址源码:<BR>http://www.vckbase.com/code/viewcode.asp?id=1645
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lirong 回复日期:2002-10-18 08:31:53
<br>内容:用这种方法,大家再发挥一下,就能很容易地实现多个应用程序共享内存空间.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lirong 回复日期:2002-10-18 09:22:08
<br>内容:还需加一句:多个应用程序框加需在不同的线程空间内,才能同时运行其各自的Thread->Run();如果在同一个线程空间内运行Thread->Run(),这些程序框架的Thread->Run()会产生冲突.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lirong 回复日期:2002-10-23 12:50:44
<br>内容:本例子程序编译后生成dll.dll和DllTest.exe,必须把dll.dll和DllTest.exe放在同一个目录,执行DllTest.exe,其装载dll.dll内程序框架.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lirong 回复日期:2002-11-13 21:22:56
<br>内容:系统实现(动态加载),但要看是进程内加载还是进程外加载,所有windows下的应用程序全都是被windows操作系统动态加载的,所有的用户应用程序都是在windows操作系统核心态基础上实现的用户态程序;API函数中有几个函数可远程启动其他应用程序,是进程外的启动,就是说被启动的应用程序与启动的应用程序不在同一个进程空间内,如何把不同的应用程序加载进同一进程空间,希望大家来探讨更多的方法。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:目不识丁 回复日期:2002-11-13 21:49:18
<br>内容:可以将pThread->Run();以及启动线程封装到一个导出函数中,由主Exe调用导出函数会简化使用
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lirong 回复日期:2002-11-17 15:19:35
<br>内容:大家来探讨!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:li huaxu 回复日期:2002-11-27 15:45:14
<br>内容:如果是一个Dialog based 程序呢?<BR>这个程序又调用了别人提供的控件,不知道应该怎么将这个Dialog based 程序转换为Dll工程?<BR><BR>大家帮帮我吧,谢谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -