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/

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/lidabo/p/2783226.html
Copyright © 2011-2022 走看看