Dll的隐式链接和显示链接

动态调用即显示链接,静态调用即隐式链接。

动态链接库(Dynamic Linked Library)缩写就是将一些api函数写入到一个dll文件中,在程序在程序运行时再加载到程序的进程空间中使用,这样可以让运行程序本身体积较小,方便模块化编程。后缀名一般是.dll。

静态链接库(StaticLibrary)和动态链接库作用基本相同但是静态链接库在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件),所以组成的exe文件体积较大,静态链接库后缀名一般为.lib。

Import导入库就综合了两种库包含两种文件.dll和.lib文件,.dll文件和上面的动态链接库相同,包含导出函数和数据等,但这里的.lib文件就和静态链接库有所不同,这里的.lib文件只是包含一些被DLL导出的函数和变量的符号名,一般称这个lib文件为引入库。

现在,开始编写一个dll,选择win32,然后win32控制台程序,选择DLL,然后在文件名.cpp中写下代码:

// testDLL.cpp : 定义 DLL 应用程序的导出函数。

#include "stdafx.h"//这里保存的是DLL的导出函数
extern "C" __declspec(dllexport) int add(int a, int b) 
{
    return (a + b);
}

extern "C" __declspec(dllexport) int sub(int a, int b)
{
    return (a - b);
}
extern "C" __declspec(dllexport) int msg()
{
	MessageBox(NULL,TEXT("第一个dll程序"),TEXT("MY"),MB_OK);
    return 0;
}


通过上面的代码编译在Debug中,可以得到一个testDLL.lib文件和一个testDLL.dll文件。然后在写程序来调用这个dll。

隐式链接:
实现一个简单的隐式链接,需要将生成的lib文件放入loadDLL工程文件夹下面,并设置编译器的附加依赖项中增加此lib(也可以直接在代码中增加使用语句如#pragma comment(lib,"testDLL.lib"))

#include <iostream>
#include <windows.h>

#pragma comment(lib,"testDLL.lib")
extern "C"_declspec(dllimport) int add(int a, int b);
extern "C"_declspec(dllimport) int sub(int a, int b);
extern "C"_declspec(dllimport) int msg();
int main()
{
    int a = 9;
    int b = 3;
    int nAdd = add(a, b);
    int nSub = sub(a, b);
    std::cout << nAdd << ":" << nSub << std::endl;
	msg();
    system("pause");
    return 0;
}

显示链接:

显示链接只需要生成的一个dll文件就能使用了,但是使用较为复杂需要用到指针函数及LoadLibrary等相关知识。在使用dll中的函数时我们首先需要使用导入函数将dll文件导入到进程地址空间再使用GetProcAddress得到dll中的函数地址再使用。

#include <iostream>
#include <windows.h>

int main()
{
    typedef int (*_pAdd)(int a, int b);
    typedef int (*_pSub)(int a, int b);
	typedef int (*_pmsg)();
    HINSTANCE hDll = LoadLibrary(TEXT("testDLL.dll"));
    int nParam1 = 9;
    int nParam2 = 3;
    _pAdd pAdd = (_pAdd)GetProcAddress(hDll, "add");
    _pSub pSub = (_pSub)GetProcAddress(hDll, "sub");
	 _pmsg pmsg = (_pmsg)GetProcAddress(hDll, "msg");
    int nAdd = pAdd(nParam1, nParam2);
    int nSub = pSub(nParam1, nParam2);
    pmsg();
    std::cout << nAdd << ":" << nSub << std::endl;
    FreeLibrary(hDll);
    system("pause");
    return 0;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值