• Visual Studio 创建和使用dll的方法


    DLL是一个包含可由多个程序同时使用的代码和数据的库。

    DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程。

    第一部分:使用Visual Studio 2010进行DLL的制作

    生成方法一:

    第一步:选择创建win32应用程序

    第二步:在弹出的应用程序向导中做出如下选择:

    第三步:在头文件添加Demoone.h

    代码如下:

    1 #ifndef _Demo_H_
    2 #define _Demo_H_
    3 #ifdef LIBDLL
    4     #define LIBDLL extern "C" _declspec(dllimport)
    5 #else
    6     #define LIBDLL extern "C" _declspec(dllexport)
    7 #endif
    8 LIBDLL int Add(int plus1, int plus2);
    9 #endif

    添加Demoone.cpp

    代码如下:

    #include "Demoone.h"
    int Add ( int a , int b )
    {
        return ( a + b );
    }

    结构视图如下:

    然后点击“生成”下的“生成解决方案”即可

    在项目目录下/debug/目录下存在DllDemoone.lib和DllDemoone.dll

    生成方法二:

    该方法不需要使用_declspec(dllimport)的方式,一二步与上同。

    第三步:

    Demotwo.h代码如下:

    #ifndef _Demo_H_
    #define _Demo_H_
    extern "C" int Add (int a , int b);
    #endif

    Demotwo.cpp和上一步骤相同

    第四步:

    添加def文件:在“添加新建项”中左侧选择“代码”,新建一个模块定义文件,名字随意。它用来创建LIB文件内容如下:

    LIBRARY "Dllmaketwo"
    EXPORTS
    Add @ 1 

    最终视图如下:

    生成解决方案也能得到dll文件。

    第二部分:使用dll文件

    当我们的程序需要使用DLL时,就需要去加载DLL,在程序中加载DLL有两种方法,分别为加载时动态链接运行时动态链接
    在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显示调用。要使用加载时动态链接,需要在编译和链接应用程序时提供头文件和导入库文件(.lib)。当这样做的时候,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置;
    在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,不需要使用导入库文件(lib)。
    在实际编程时有两种使用DLL的方法,那么到底应该使用那一种呢?在实际开发时,是基于以下几点进行考虑的:
    1、启动性能 如果应用程序的初始启动性能很重要,则应使用运行时动态链接;
    2、易用性 在加载时动态链接中,导出的DLL函数类似于本地函数,我们可以方便地进行这些函数的调用;
    3、应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。

    方法一:加载时动态链接

    新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

    代码按如下方式书写:

    #include <iostream>
    #include"Demoone.h"//方法a
    using namespace std;
    #pragma comment(lib, "DLLDemoone.lib")
    //extern "C" _declspec(dllimport) int Add(int a, int b);//方法b
    int main(int argc, char *argv[])
    {
          cout<<Add(2, 3)<<endl;
          return 0;
    }

    运行即可获得正确的结果。

    方法a和方法b是两种不同方式,若使用方法b则不需要拷贝Demo.h这个头文件。

    方法二:运行时动态链接

    新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    typedef int (*AddFunc)(int a, int b);
    int main(int argc, char *argv[])
    {
          HMODULE hDll = LoadLibrary("DLLmaketwo.dll");
          if (hDll != NULL)
          {
                AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE(1));
                if (add != NULL)
                {
                      cout<<add(2, 3)<<endl;
                }
                FreeLibrary(hDll);
          }
    }

    在这里会碰到error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”的问题,解决方式是将工程的字符方式进行修改即可,具体见另一篇:

    http://www.cnblogs.com/holyprince/p/4236586.html

    创建和使用方法大致分为以上四种,参考了两篇文章,多谢他们:

    http://www.jellythink.com/archives/111

    http://www.aichengxu.com/view/14438

  • 相关阅读:
    PHP WEB项目文件夹上传下载解决方案
    .NET WEB项目文件夹上传下载解决方案
    C#.NET WEB项目文件夹上传下载解决方案
    python 多重继承
    python 多态
    python 类型判断-- isinstance函数
    python 继承
    hdu 5692 Snacks 线段树+dfs
    线段树的输出
    python 定义类方法
  • 原文地址:https://www.cnblogs.com/holyprince/p/4236818.html
Copyright © 2020-2023  润新知