CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

谁帮忙介绍一下编写动态链接库

楼主shuibing(水兵)2001-07-10 15:58:44 在 VC/MFC / 基础类 提问

帮助解释一下如何编写动态链接库,最好有源码例子 问题点数:35、回复次数:4Top

1 楼greatll(流流)回复于 2001-07-10 16:11:52 得分 0

网上多得很。Top

2 楼wjyasd(金子鱼)回复于 2001-07-10 16:14:31 得分 35

这里有!     (我多贴了多少遍了,不知道     ^&^)  
   
  一.两种类型的比较:    
  ----   1.   基于MFC的DLL限制在使用MFC的编译器中.    
  ----   基于API的DLL可以从一种编译器移植到另一种编译器.    
   
  ----   2.   基于MFC的DLL可以由制作向导构建框架,制作简单    
   
  ----   基于API的DLL的制作向导只为你制作了一个空的DLL工程,工程的维护和代码的编写全部需要手工完成(这一点在VC   6.0中有了改进)    
   
  ----   3.   基于MFC的DLL不适用与制作读取二进制文件的DLL    
   
  ----   (无法正确读取与DOS应用程序共享的二进制文件)    
   
  ----   基于API的DLL可以正确读取在DOS环境中创建的二进制文件.    
   
  ----   造成该结果的原因其实很简单:    
   
  ----   在读取二进制文件的过程中通常会使用"结构(体)",基于MFC的DLL要加载MFC,它要求"结构成员位对齐"的比特位是8位,而且你无法方便的通过选中"Project-   >Setting-   >C/C++"选项卡中的"Code   Generation"再修改"Struct   member   alignment"来使其变为1位(在VC5.0中即使改变了,在编译时该改变也会被忽略.不过这一不足在VC6.0中已经得到了改进,读者有兴趣的话可参见笔者《在VC6.0中读取二进制文件的惊喜》一文).    
   
  ----   而基于API的DLL则可以通过以上的方法方便的实现.    
   
  二.在实际制作与使用中的一点经验:    
  ----   1.制作DLL的目的之一是共享资源/代码.所谓"共享"当然不应该仅仅是几个VC++制作的应用程序可以使用,但是在与其他编程语言协作时,有些问题是需要注意的.    
  ----   在制作DLL时,VC++对函数的省缺声明是"__cedcl",也就是说,如果你在声明你的函数时不作特殊声明的话,你制作的DLL将只能被C/C++调用,如果你想用其他开发语言(比如VB5.0)调用它就会报错,即使调用方法完全正确.    
   
  ----   那么该怎么办呢,你一定已经猜到了---不要用省缺的声明方式---一个很好的选择是使用"WINAPI"来声明你的函数.它可以把你的DLL中的函数声明成WINDOWS   API供其他程序调用(当然也包括C/C++制作的程序).    
   
  ----   2.建议你在制作DLL的同时制作包括导出函数原型声明的.H文件虽然这不是必须的但是若你的DLL是被C/C++调用,.H文件和.LIB文件可以为使用你的DLL的开发人员省去不少精力,当你需要修改/升级你的DLL时更是如此.DLL的C/C++使用者只要在工程中引入.H和.LIB文件可以象使用自己编写的函数一样方便的使用DLL中的函数,不必再使用存储DLL句柄、声明函数型指针、LoadLibrary、GetProcAddress那样繁复的调用方式.    
   
  ----   3.虽然你不必编写.DEF文件就能制作出基于API的.DLL文件.但是制作.DEF文件并不难,至少你有捷径可以走.有一个很简单的方法你不妨一试:    
   
  ----   例如,你用基于API的方法制作了一个DLL工程文件并为其编写了.CPP和.H文件,你可以保存并关闭该工程,然后在另一个目录中创建一个与其同名的基于MFC的DLL工程.好了,现在你已经知道怎么做了---将该目录中的.DEF文件移动过去就可以了.省下的工作就是再次打开基于API的DLL工程,并将.DEF文件加入工程,将你的导出函数的函数名加到EXPORTS之后,再重新编译工程就OK了.    
   
  ----   4.DLL文件的省缺名称是与工程名一致的(也是在.DEF文件中LIBRARY   之后的名字),不要试图在制作完毕之后通过简单的修改.DLL文件的文件名来改变它,这会导致使用该DLL的应用程序错误.    
   
  三.一个例子:    
  ----   DLL中定义有两种函数:    
  ----   导出函数(exportfunction):   可以被其他模块调用    
  ----   内部函数(internalfunction):   只能在DLL内部使用    
  ----   创建一个基于API的DLL.本例只定义了导出函数.    
   
  ----   1.在FILE-   >NEW-   >PROJECTS中选择"WIN32   Dynamic-Link   Library"在Project   Name中输入   "a"按OK    
   
  ----   2.在FILE-   >NEW-   >FILES中选择C++   SOURCE   FILE,在FILE中输入a.cpp,按OK    
   
  ----   在FILE-   >NEW-   >FILES中选择TEXT文件,在FILE中输入a.h,按OK    
   
  ----   在FILE-   >NEW-   >FILES中选择TEXT文件,在FILE中输入a.def,按OK    
   
  ----   3.源文件:    
   
          //---------------------------  
          //a.cpp  
          #include   <   windows   >  
          int   WINAPI   add(int   a,int   b)  
          {         return   (a+b);  
          }  
          //---------------------------  
          //a.h  
          int   WINAPI   add(int   a,int   b);  
          //---------------------------  
          //a.def  
          LIBRARY             "a"         ;指出DLL的名字  
          DESCRIPTION     'aaa   Windows   Dynamic   Link   Library'  
          ;描述DLL的用途(此句可选)  
          EXPORTS                 add         ;导出函数的名字  
   
  四.调用DLL的方法:    
  ----   1.通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一:    
  ----   (1)Windows的系统目录:\windows\system;    
   
  ----   (2)DOS中path所指出的任何目录;    
   
  ----   (3)程序所在的目录;    
   
  ----   同时应注意管理好你的.lib文件和.h和文件    
   
  ----   2.建立一个工程,简单起见可建立一个控制台应用程序.    
   
  ----   3.在工程中引入a.lib:    
   
  ----   (1)如果你的a.lib放在VC标准的LIB文件夹中.    
   
      单击Project-   >Project   Settings...  
      在link选卡的object/library   modules中加上a.lib即可  
   
  ----   (2)如果你的a.lib不是放在VC标准的LIB文件夹中    
      单击Project-   >Add   to   Project-   >files...  
      找到a.lib文件,按OK  
  <   pre   >  
  4.//------------------------  
              //call_a.cpp  
              #include<   stdio.h   >  
              #include   "c:/a/a.h"  
              void   main(void)          
              {         int   c=0;  
   
                  c=add(1,2);  
                  printf("1+2=%d",c);  
              }  
          //本程序在VC5.0下调试通过Top

3 楼flagfly(我也不知道要去哪里)回复于 2001-07-10 17:45:01 得分 0

wjyasd(即使用FPE改了钱,也绝不能忘记艰苦朴),精品啊Top

4 楼shuibing(水兵)回复于 2001-08-06 09:02:44 得分 0

给分Top

相关问题

  • 用vb编写动态连接库
  • java调用vb编写的动态库
  • 兄弟正在编写动态链接库(dll),不知如何入手,手边的资料介绍的不是很清楚,请问
  • 在vc中怎么调用vb编写的动态连接库~~~~~~~~~~~!
  • 在PB中如何使用VC编写的动态连接库
  • 关于编写动态链接库的问题?
  • 如何用汇编写动态连接库(DLL)
  • 急!DELPHI编写动态连接库问题!
  • Linux有没动态链接库?怎么编写?
  • 使用MSComm32.ocx编写动态连接库的问题

关键词

  • c/c++
  • vc++
  • dll
  • 二进制
  • 文件
  • 编译器
  • vc
  • mfc
  • 制作
  • api

得分解答快速导航

  • 帖主:shuibing
  • wjyasd

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo