⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc++动态链接库编程之mfc扩展 dll-开发者网络-dll-天极yes1ky.htm

📁 从网上下载的关于学习动态链接库的连载教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    <TD>AFX_EXT_API</TD>
    <TD>#ifdef _AFXEXT<BR> AFX_API_EXPORT<BR>#else<BR> AFX_API_IMPORT</TD></TR>
  <TR>
    <TD>AFX_EXT_DATA</TD>
    <TD>#ifdef 
  _AFXEXT<BR> AFX_DATA_EXPORT<BR>#else<BR> AFX_DATA_IMPORT</TD></TR></TBODY></TABLE><BR>  <B>6.2 
MFC扩展DLL导出MFC派生类</B><BR><BR>  在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。<BR><BR>  使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };<BR>extern "C" 
      int APIENTRY<BR><BR>DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID 
      lpReserved )<BR>{<BR> // Remove this if you use 
      lpReserved<BR><BR> UNREFERENCED_PARAMETER( lpReserved 
      );<BR><BR> //说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零<BR><BR> if 
      (dwReason == DLL_PROCESS_ATTACH)<BR> {<BR>  TRACE0( "EXTDLL.DLL 
      Initializing!\n" );<BR>  // Extension DLL one-time initialization<BR>  if 
      ( !AfxInitExtensionModule( ExtDllDLL, hInstance ))<BR>   return 
      0;<BR>   // Insert this DLL into the resource chain<BR>  new 
      CDynLinkLibrary( ExtDllDLL );<BR> }<BR> else if (dwReason == 
      DLL_PROCESS_DETACH)<BR> {<BR>  TRACE0( "EXTDLL.DLL Terminating!\n" 
      );<BR>  // Terminate the library before destructors are 
      called<BR>  AfxTermExtensionModule( ExtDllDLL );<BR> }<BR> return 1; // 
      ok<BR>}</TD></TR></TBODY></TABLE><BR>  这一段代码含义晦涩,我们需要对其进行解读:<BR><BR>  (1)上述代码完成MFC扩展DLL的初始化和终止处理;<BR><BR>  (2)初始化期间所创建的 
CDynLinkLibrary 对象使MFC扩展 DLL 可以将 DLL中的CRuntimeClass 
对象或资源导出到应用程序;<BR><BR>  (3)AfxInitExtensionModule函数捕获模块的CRuntimeClass 结构和在创建 
CDynLinkLibrary 对象时使用的对象工厂(COleObjectFactory 
对象);<BR><BR>  (4)AfxTermExtensionModule函数使 MFC 得以在每个进程与扩展 DLL 
分离时(进程退出或使用AfxFreeLibrary卸载DLL时)清除扩展 DLL;<BR><BR>  (5)第一条语句static 
AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL 
};定义了一个AFX_EXTENSION_MODULE类的静态全局对象,AFX_EXTENSION_MODULE的定义如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>struct AFX_EXTENSION_MODULE<BR>{<BR> BOOL bInitialized;<BR> HMODULE 
      hModule;<BR> HMODULE hResource;<BR> CRuntimeClass* 
      pFirstSharedClass;<BR> COleObjectFactory* 
  pFirstSharedFactory;<BR>};</TD></TR></TBODY></TABLE><BR>  由AFX_EXTENSION_MODULE的定义我们可以更好的理解(2)、(3)、(4)点。<BR><BR>  在资源编辑器中添加一个如图15所示的对话框,并使用MFC类向导为其添加一个对应的类CExtDialog,系统自动添加了ExtDialog.h和ExtDialog.cpp两个头文件。<BR><BR>
<TABLE width="90%" align=center border=0>
  <TBODY>
  <TR>
    <TD>
      <DIV align=center><IMG 
      src="VC++动态链接库编程之MFC扩展 DLL-开发者网络-dll-天极Yes1ky.files/z44bxd805tf3.jpg" 
      border=0><BR>图15 
MFC扩展DLL中的对话框</DIV></TD></TR></TBODY></TABLE><BR>  修改ExtDialog.h中CExtDialog类的声明为:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
  <TBODY>
  <TR>
    <TD>class AFX_EXT_CLASS CExtDialog : public 
      CDialog<BR>{<BR> public:<BR>  CExtDialog( CWnd* pParent = NULL ); 
      <BR>  enum { IDD = IDD_DLL_DIALOG };<BR> protected:<BR>  virtual void 
      DoDataExchange( CDataExchange* pDX ); 
  <BR>  DECLARE_MESSAGE_MAP()<BR>};</TD></TR></TBODY></TABLE><BR>  这其中最主要的改变是我们在class 
AFX_EXT_CLASS CExtDialog语句中添加了“AFX_EXT_CLASS”宏,则使得DLL中的CExtDialog类被导出。<BR><BR>
<DIV class=right>共3页。 <A class=page 
href="http://dev.yesky.com/359/2145859.shtml" target=_self><FONT 
color=#666666><B>1</B></FONT></A> <A class=page 
href="http://dev.yesky.com/359/2145859_1.shtml" target=_self><B>2</B></A> <A 
class=page href="http://dev.yesky.com/359/2145859_2.shtml" 
target=_self><B>3</B></A> <A class=page 
href="http://dev.yesky.com/359/2145859_1.shtml" target=_self><FONT 
face=Webdings>8</FONT></A> <A class=page 
href="http://dev.yesky.com/359/2145859_2.shtml" target=_self><FONT 
face=Webdings>:</FONT></A></DIV></DIV><!--广告代码开始-->
<SCRIPT>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {
ad_cid = 412;
}
</SCRIPT>
<!--小通栏:c-scolumn顶部500*90--><SPAN id=span_ad1>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-scolumn.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad1").innerHTML=document.getElementById("span_ad1").innerHTML;
document.getElementById("span_ad1").innerHTML="";
</SCRIPT>
<!--c-pip文章正文中间240*200--><SPAN id=span_ad3>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-pip.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT>
if(document.getElementById("contentAdv")) {
document.getElementById("contentAdv").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
} else {
document.getElementById("ad3").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
}</SCRIPT>
<!--c-text-1“您现在的位置”右侧文字--><SPAN id=span_ad2>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-text-1.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad2").innerHTML=document.getElementById("span_ad2").innerHTML;
document.getElementById("span_ad2").innerHTML="";
</SCRIPT>
<!--c-column-2“标题”上面的广告--><SPAN id=span_ad10>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-2.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad10").innerHTML=document.getElementById("span_ad10").innerHTML;
document.getElementById("span_ad10").innerHTML="";
</SCRIPT>
<!--c-column-1“摘要”下面的广告--><SPAN id=span_ad9>
<DIV id=ad9ad>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-1.js\"><\/script>");</SCRIPT>
</DIV></SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad9").innerHTML=document.getElementById("span_ad9").innerHTML;
document.getElementById("span_ad9").innerHTML="";
</SCRIPT>
<!--广告代码结束-->
<DIV id=ad7ad><SPAN id=ad7></SPAN></DIV>
<DIV class=clear></DIV>
<DIV id=conlink>
<SCRIPT type=text/javascript>var clipBoardContent = document.URL;  function copyUserHomeToClipBoard()  {    window.clipboardData.setData("Text",clipBoardContent);  alert("复制成功,请粘贴到你的QQ/MSN上推荐给你的好友!\r\n\r\n内容如下:\r\n" + clipBoardContent);  }</SCRIPT>

<FORM id=feedbackForm name=feedbackForm 
action=http://feedback.yesky.com/reader/user/doWelcome.view target=_blank><INPUT 
id=refurl type=hidden name=refurl> <INPUT id=reftitle type=hidden name=reftitle> 
</FORM>
<SCRIPT type=text/javascript>document.write("<a href=\"http:\/\/dig.yesky.com\" id=\'yeskyDig\'  onclick=\"javascript:this.href=\'http:\/\/dig.yesky.com\/ding.php?t=\'+encodeURIComponent(document.title)+\'&u=\'+escape(document.location.href)+\'&ac=ding\';\" target=_blank title=\"此文不错,我顶!\"><b>我顶一下<\/b><\/a> <a onclick='javascript:submitFeedback();' style='cursor:hand;'><font color='#FF0000'><b>我要挑错</b></font></a> <a href=\"#top\" target=\"_self\"><a href=\"javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(yesky=window.open('http://hot.yesky.com/dp.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t)+'&st=2','_blank','scrollbars=no,width=400,height=480,left=75,top=20,status=no,resizable=yes'));yesky.focus();\"title=\"推荐到天极网摘 http://hot.yesky.com [鼠标划选本文摘要,然后点击本图片]\" target=\"_self\">收藏到天极收藏夹</a> <a href=\"JavaScript: copyUserHomeToClipBoard()\" target=\"_self\">复制链接发给好友</a> <a href=\"javascript:window.external.AddFavorite('"+clipBoardContent+"')\" target=\"_self\">加入收藏</a> <a href=\"javascript:window.print()\" target=\"_self\">打印</a> <img src=\"http://image.yesky.com/TLimages/newmobile/titlebg19.gif\" title=\"返回顶部\"/></a>");function submitFeedback() {	document.getElementById("refurl").value=document.location.href;	document.getElementById("reftitle").value=document.title;	document.getElementById("feedbackForm").submit();}</SCRIPT>
</DIV>
<DIV class=clear></DIV><!--评论-->
<SCRIPT language=JavaScript>
<!--
var aid = 2145859;
var channelid = 324;
var tagname = "dll";
//-->
</SCRIPT>

<SCRIPT language=JavaScript>
if(typeof(channelid) != "undefined") {
	document.write("<script language=\"JavaScript\" charset=\"gb2312\"  src=\"http://comments.yesky.com/channlereview/6/"+(channelid%5000)+"/"+channelid+".js\"><\/script>");
}
</SCRIPT>

<SCRIPT language=javascript>
<!--
if(typeof(aid) != "undefined") {
		document.write("<script language=\"JavaScript\" charset=\"gb2312\"  src=\"http://comments.yesky.com/articlereplies/6/"+(aid%5000)+"/"+aid+".js\"><\/script>");
 }
//-->
</SCRIPT>

<SCRIPT src="VC++动态链接库编程之MFC扩展 DLL-开发者网络-dll-天极Yes1ky.files/mobile_comment.js" 
type=text/javascript></SCRIPT>

<DIV class=clear></DIV><!--相关文章等-->
<DIV id=conrele>
<DIV class=xgleft id=__002>
<DIV class=xgmenus>相关文章</DIV>
<DT><!-- Error --></DT></DIV>
<DIV class=xgright id=__003>
<DIV class=xgmenus>最新更新</DIV>
<DT></DT>
<DD>·<A href="http://dev.yesky.com/5/7608505.shtml">还原默认SQL Server Management 
Studio配置</A></DD>
<DD>·<A href="http://dev.yesky.com/320/7608320.shtml">带你轻松接触 SQL Server 
服务管理器</A></DD>
<DD>·<A href="http://dev.yesky.com/77/7608077.shtml">DB2数据库SQL编码优化基础</A></DD>
<DD>·<A href="http://dev.yesky.com/85/7608085.shtml">如何构造一个C#语言的爬虫程序</A></DD>
<DD>·<A href="http://dev.yesky.com/431/7607931.shtml">数据库优化之SQL语句性能调整原则</A></DD>
<DD>·<A 
href="http://dev.yesky.com/376/7607876.shtml">Silverlight学习:拖动滚动条来控制媒体播放</A> 
</DD></DIV></DIV>
<DIV class=clear></DIV><!--天极无线-->
<DIV class=conpict>天极无线</DIV>
<DIV>
<DIV>
<OBJECT id=templink type=application/x-shockwave-flash height=100 width=640 
data=http://image.yesky.com/TLimages/include/other/mobile_ad.swf></OBJECT></DIV></DIV></DIV><!--右边开始-->
<DIV id=conright>
<DIV id=adgg5>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-pip1.js\"><\/script>");</SCRIPT>
</DIV>
<DIV class=clear></DIV><!--此文读者又读了以下内容-->
<DIV id=__004><!-- Error --></DIV><!--群乐-->
<DIV class=clear></DIV>
<DIV id=__005>
<DIV class=conpdbox>
<DIV>
<DIV class=conpdqbg id=clayer1 onmouseover=showlayer(2,1)>热门群乐</DIV>
<DIV class=conmibg></DIV>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -