动态库dll

dll生成:

  在dllDemo.h头文件中如下定义:

    为了能找到dll的函数地址,生成dll时需要将其中的函数声明为C函数(extern "C"

  原因:

    一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”,  

    extern 表示这是个全局函数,可以供各个其他的函数调用;

     “C” 表示编译时按照 C编译器的方式进行编译,而不是C++。 C++的编译方式考虑了函数重载,所以对函数名进行了新的修饰,产生了所谓的破坏性命名。

              __declspec(dllexport) 参见:https://www.cnblogs.com/slysky/p/10560081.html

#pragma once

extern "C" __declspec(dllexport) int Add(int x, int y);

  在cpp文件中实现Add函数时:

#include "dllDemo.h"

int Add(int, int)
{
    return x + y;
}

配置生成的文件(dll、lib)路径:

  dll: 链接器-->常规-->输出文件

  lib: 链接器-->高级-->导入库

 

dll使用方法:(隐式加载、显式加载)

1.隐式加载

  a.项目中配置好.h、.lib的路径

#include <iostream>
#include "dllDemo.h"

using namespace std;

extern int Add(int, int);

int main()
{
    int sum = Add(1, 1);
    cout << sum << endl;

    return 0;
}

  b.生成exe

  b.将dll拷贝至exe路径下

  d.运行exe

2.显式加载(只需要dll文件,不需要.h和.lib)

#include <iostream>
#include <windows.h>
using namespace std;

typedef int(*FUNCADDR) (int, int);

int main()
{
    HINSTANCE dllDemo = LoadLibrary("dllDemo.dll");
    FUNCADDR Add;
    if (dllDemo)
    {
        Add = (FUNCADDR)GetProcAddress(dllDemo, "Add");

        int sum = Add(1,1);
        cout << sum << endl;
    }

    return 0;
}

  

编译报错:

  Error C2664:无法将参数 1 从“const char [12]”转换为“LPCWSTR”

原因:

  当前工程只支持Unicode字符,不支持多字节,此时如果代码中出现多字节字符串, 就会报错。LoadLibrary 函数有两个版本,一个LoadLibraryW 针对Unicode版的,一个是LoadLibraryA 针对Multi-Byte(多字节)版的

解决方法:

  项目属性->常规->字符集->使用多字节字符集

  

 

  

 

posted @ 2016-09-05 00:16  那一剑的風情  阅读(257)  评论(0)    收藏  举报