用VC++制作DLL经验一二

来源:互联网 发布:淘宝发射器暗号 编辑:程序博客网 时间:2024/05/16 10:55

用VC++制作DLL经验一二

 

建立一个自己的DLL并在另一个应用程序中成功的调用它之后再阅读'一'、'二'.

 

---- DLL可以分为两个不同的类别:用C/C++(不用对象)编写的基于API的传统DLL

和基于MFC对象的DLL.

 

一.两种类型的比较:

---- 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 >

        WINAPI int add(int a,int b)

        {       return (a+b);

        }

        //---------------------------

        //a.h

        WINAPI int add(int a,int b);

        //---------------------------

        //a.def

        LIBRARY      "aaa"     ;指出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下调试通过

 

 

 

 

 

 

 

原创粉丝点击