zoukankan      html  css  js  c++  java
  • VC下动态库dll,静态库lib的编写和使用方法


    在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些DLL或者LIB库供别人使用,那么怎么制作DLL或者LIB文件呢?今天特酷吧根据自己的实际情况给大家讲解下基本的制作方法。
    以下是我亲自操作的记录:
    1,动态库dll的编写方法:
    新建一个动态链接库:


    填好工程名称即可选择工程类型,如果没有特别的要求,选择一个空工程即可。
    会看到这里和标准的控制台工程一样,没有任何系统默认建立的文件


    下面就需要我们添加一些文件。
    建立动态库dll文件 , 我们不需要写main函数。只需要一个一个的实现我们需要实现的接口函数即可.这里需要用到
    extern "C" __declspec(dllexport)  说明 。 在函数的声明中加上extern "C" __declspec(dllexport)就可以将该函数导出。
    例如 :
    新建function.h , function.cpp
    function.h
    #ifndef __FUNCTION_H__
    #define __FUNCTION_H__
    #include<afx.h>
    #include"include.h"
    //3DES加密函数.24字节的key(导出函数)
    extern "C" __declspec(dllexport)HANDLE Open();
    #endif
    而在function.cpp中可以写
    extern "C" __declspec(dllexport) HANDLE Open()
    {
     HANDLE DevHandle = INVALID_HANDLE_VALUE;
     DevHandle = OpenDevice();
     return DevHandle;
    }
    完成之后编译 , 就可以在debuf或者release文件夹中看到dll文件了。
    使用dll文件也很简单:将生成的dll文件放在应用程序的工程目录,我们还需要上一步的导出头文件。
    #include"AppTest.h"
    //#pragma   comment(lib, "AppTest.lib ")
    HINSTANCE MyDll;
    HANDLE Encryp;
     //打开dll文件
     MyDll = LoadLibrary("AppTest.dll");
     if(MyDll == NULL)
     {
      exit(0);
     }
     typedef HANDLE(*DllFun)();//函数指针,注意要和原函数的原型一制
     DllFun MyFun;
     MyFun = (DllFun)GetProcAddress(MyDll , "Open");//获取该函数的虚拟地址
     if(MyFun == NULL)
     {
       AfxMessageBox("获取dll函数失败!");
       exit(0);
     }
     Encryp = MyFun();//调用MyFUn实际上是调用了dll中的OpenDog
     if( Encryp == INVALID_HANDLE_VALUE )
     {
    exit(0);
     }


    静态库的创建与应用
    新建一个静态库工程


    没有什么注意的选项 ,默认即可。完成之后 , 工程目前也是什么文件都没有 , 需要我们自己添加。我们也不写main函数,只需要写功能函数的实现。然后在头文件中用extern修饰 , 编译即可。
    如我们新建function.h  , function.cpp文件。
    function.h
    #ifndef __FUNCTION_H__
    #define __FUNCTION_H__
    #include<afx.h>
    #include"include.h"
    extern   HANDLE OpenDog();
    #endif
    function.cpp
    HANDLE OpenDog()
    {
     HANDLE DevHandle = INVALID_HANDLE_VALUE;
     DevHandle = OpenDevice();
     return DevHandle;
    }
    如此,编译即可。
    但是我在这里遇到了很多问题 , 编译的时候总是提示错误。这主要是一些命名空间的重名造成的。这种错误很麻烦。这里给出我在编译lib时的工程设置。


    具体的要特别注意到第二张显示的忽略库
    lib静态库的使用:使用#pragma   comment(lib, "AppTest.lib")后 , 直接调用静态库的函数即可。
    #include"AppTest.h"
    #pragma   comment(lib, "AppTest.lib")
    HANDLE EncrypDog;
     EncrypDog = OpenDog();
     if( EncrypDog == INVALID_HANDLE_VALUE )
     {
       exit(0);
     }


    本文来源于特酷吧http://www.tekuba.net/, 原文地址:http://www.tekuba.net/program/179/

  • 相关阅读:
    统计任意字符串中字符出现次数,利用HashMap实现
    常用控件的使用方法
    Opencv读取图片和视频
    复制文件夹(多级递归)
    将指定文件中的数据存入集合中
    将集合中的学生对象输出到指定文件中
    利用缓冲字符输入流读取学生姓名名单实现点名
    字符流中的编码和解码分析
    字节缓冲流和基本字节流读取文件(一个字节读取,一个字节数组读取)
    路径中““、“/“的区别
  • 原文地址:https://www.cnblogs.com/lidabo/p/2783226.html
Copyright © 2011-2022 走看看