📄 vc++动态链接库编程之读者反馈与答复-开发者网络-vc-天极yesky.htm
字号:
<TR>
<TD>////////////////////////////////////////////////////////////////////////////////<BR>//函数名:SendInit<BR>//函数功能:DLL提供给应用程序调用接口,用于启动发送线程<BR>/////////////////////////////////////////////////////////////////////////////<BR>void
SendInit(void)<BR>{<BR> hSendThread = CreateThread( NULL, 1000,
SendThreadFunc, this, 1, &uSendThreadID
);<BR>}<BR></TD></TR></TBODY></TABLE><BR> (4)SendMsg函数<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>////////////////////////////////////////////////////////////////////////////////<BR>//函数名:SendMsg<BR>//函数功能:DLL提供给应用程序调用接口,用于发送报文<BR>/////////////////////////////////////////////////////////////////////////////<BR>extern
"C" void WINAPI SendMsg( InterDataPkt sendData ) <BR>{<BR> sendSockData =
sendData;<BR> SetEvent( hSendEvent );
//释放发送事件<BR>}</TD></TR></TBODY></TABLE><BR> 以上程序仅仅是一个简单的例子,其实在许多工程应用中,我们经常看到这样的处理方式。这个DLL对用户而言仅仅使一个简单的接口函数SendMsg,对调用它的应用程序屏蔽了多线程的技术细节。与之类似,MFC提供的CSocket类在底层自己采用了多线程机制,所以使我们免去了对多线程的使用。<BR><BR> 您好,看了您的DLL文章,发现导出函数可以直接用_declspec(dllexport)声明或在.def文件中定义,变量的导出也一样。我想知道类是否也可以在.def文件中导出?您的文章中只讲了在类前添加_declspec(dllexport)导出类的方法。请您指教!<BR><BR> 回答:<BR><BR> 一般我们不采用.def文件导出类,但是这并不意味着类不能用.def文件导出类。<BR><BR> 使用Depends查看连载2的"导出类"例程生成的DLL,我们发现其导出了如图21的众多"怪"symbol,这些symbol都是经过编译器处理的。因此,为了以.def文件导出类,我们必须把这些"怪"symbol全部导出,实在是不划算啊!所以对于类,我们最好直接以_declspec(dllexport)导出。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG
src="VC++动态链接库编程之读者反馈与答复-开发者网络-VC-天极Yesky.files/t5u84cjh02yz.jpg"
border=0><BR>图1
导出类时导出的symbol</DIV></TD></TR></TBODY></TABLE><BR> 您好,看了您的DLL文章,知道怎么创建DLL了,但是面对一个具体的工程,我还是不知道究竟应该把什么做成DLL?您能给一些这方面的经验吗?<BR><BR> 回答:<BR><BR> DLL一般用于软件模块中较固定、较通用的可以被复用的模块,这里有一个非常好的例子,就是豪杰超级解霸。梁肇新大师把处理视频和音频的算法模块专门做成了两个DLL,供超级解霸的用户界面GUI程序调用,实在是DLL设计的模范教程。所谓"万变不离其宗",超级解霸的界面再cool,用到的还是那几个DLL!具体请参考《编程高手箴言》一书。<BR><BR> 您好,您的DLL文章讲的都是Windows的,请问Linux操作系统上可以制作DLL吗?如果能,和Windows有什么不一样?谢谢!<BR><BR> 回答:<BR><BR> 在Linux操作系统中,也可以采用动态链接技术进行软件设计,但与Windows下DLL的创建和调用方式有些不同。<BR><BR> Linux操作系统中的共享对象技术(Shared
Object)与Windows里的DLL相对应,但名称不一样,其共享对象文件以.so作为后缀。与Linux共享对象技术相关的一些函数如下:<BR><BR> (1)打开共享对象,函数原型:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//打开名为filename共享对象,并返回操作句柄;<BR>void *dlopen (const char *filename, int
flag); </TD></TR></TBODY></TABLE><BR> (2)取函数地址,函数原型:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//获得接口函数地址<BR>void *dlsym(void *handle, char *symbol);
</TD></TR></TBODY></TABLE><BR> (3)关闭共享对象,函数原型: <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//关闭指定句柄的共享对象<BR>int dlclose (void
*handle);</TD></TR></TBODY></TABLE><BR> (4)动态库错误函数,函数原型: <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//共享对象操作函数执行失败时,返回出错信息<BR>const char *dlerror(void);
</TD></TR></TBODY></TABLE><BR> 从这里我们分明看到Windows
API――LoadLibrary、FreeLibrary和GetProcAddress的影子!又一个"万变不离其宗"!<BR><BR> 本系列文章的连载暂时告一段落,您可以继续给笔者发送email(mailto:21cnbao@21cn.com)讨论DLL的编程问题。对于文中的错误和纰漏,也热诚欢迎您指正。
</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 = 2166440;
var channelid = 324;
var tagname = "VC";
//-->
</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++动态链接库编程之读者反馈与答复-开发者网络-VC-天极Yesky.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></DT>
<DD>·<A href="http://soft.yesky.com/257/2212757.shtml">VC++中进程间相互通信的十一种方法
</A></DD>
<DD>·<A href="http://dev.yesky.com/343/2206343.shtml">用VC制作带弹出式菜单的按钮 </A></DD>
<DD>·<A
href="http://soft.yesky.com/93/2203093.shtml">VC实现Win2000下屏蔽Ctrl+Alt+Del键
</A></DD>
<DD>·<A href="http://dev.yesky.com/430/2201430.shtml">利用钩子技术控制进程创建(附源代码)
</A></DD>
<DD>·<A href="http://dev.yesky.com/493/2200993.shtml">新手留意 Visual C++的界面元素图解
</A></DD>
<DD>·<A href="http://dev.yesky.com/213/2199213.shtml">用VC纯资源DLL解决国际化问题
</A></DD></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>
<DIV class=conrtbox>
<DIV class=menu>关注此文读者还看过</DIV>
<DIV class=conqldq>
<DT></DT>
<DD>·<A href="http://dev.yesky.com/102/3043102.shtml">Visual C++视频教程:第一课
H</A></DD>
<DD>·<A href="http://dev.yesky.com/496/3041496.shtml">Visual C++视频教程:第一课
G</A></DD>
<DD>·<A href="http://dev.yesky.com/227/3031227.shtml">关于MFC内部结构实用的一点看法</A></DD>
<DD>·<A href="http://dev.yesky.com/362/3026862.shtml">用MFC的消息映像实现动态菜单</A></DD>
<DD>·<A
href="http://dev.yesky.com/200/3025200.shtml">VC++与MATLAB混合编程及其应用</A></DD>
<DD>·<A
href="http://dev.yesky.com/228/3023228.shtml">用Windows消息循环实现消息延迟和合并</A></DD>
<DD>·<A href="http://dev.yesky.com/177/3021677.shtml">VC++实现计算机并口的数据采集</A></DD>
<DD>·<A href="http://dev.yesky.com/364/3017864.shtml">Visual C++视频教程:第一课
F</A></DD>
<DD>·<A href="http://dev.yesky.com/231/3013231.shtml">Visual C++视频教程:第一课
E</A></DD></DIV>
<DIV class=clear></DIV></DIV></DIV><!--群乐-->
<DIV class=clear></DIV>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -