DLL的两种加载方式

原创 2016年05月31日 20:22:12

DLL有两种调用方式
一,隐式加载(需要.lib和.dll)
二,显式加载(需要.dll)


DLL隐式加载


隐式加载就是在程序编译的时候就将dll编译到可执行文件中,这种加载方式调用方便,程序发布的时候可以不用讲dll带着.缺点是,这样编译出来后,程序会很大

新建一个简单的工程,将dllDemo.lib和dllDemo.dll复制到debug同目录(工程根目录)下(因为用VC运行程序时程序的工作目录是这个工程的根目录,而单独运行程序的时候,工作目录是程序所在目录),测试代码如下:

#include <stdio.h>

//隐式加载dll
#pragma comment(lib, "dllDemo.lib")

//声明外部函数
extern void exportSwap(int *piA, int *piB);

int main(void)
{
    int a = 3;
    int b = 2;

    printf("a = %d, b = %d\n", a, b);
    exportSwap(&a,&b);     //直接调用
    printf("a = %d, b = %d\n", a, b);

    return 0;
}

程序运行结果 :

可以看到程序在一开始就加载了dll,然后成功调用dll里的函数


这里写图片描述
这里写图片描述


DLL显式加载


DLL显式加载时指在程序运行过程中,需要用到dll里的函数时,再动态加载dll到内存中,这种加载方式因为是在程序运行后再加载的,所以可以让程序启动更快,而且dll的维护更容易,使得程序如果需要更新,很多时候直接更新dll,而不用重新安装程序.只是这种加载方式,函数调用稍微复杂一点

同样上面那个工程,将代码稍微改一下

#include <stdio.h>
#include <windows.h>

//定义一个指向空的函数指针
typedef void (* DLLDEMOFUNC)(void);

int main(void)
{
    int a = 3;
    int b = 2;
    DLLDEMOFUNC dllFunc = NULL;
    HINSTANCE hDll;

    printf("a = %d, b = %d\n", a, b);

    //动态加载dll
    hDll = LoadLibrary("dllDemo.dll");
    //根据函数名获取dll地址
    dllFunc = (DLLDEMOFUNC)GetProcAddress(hDll, "exportSwap");
    //调用dll的导出函数
    dllFunc(&a, &b);

    printf("a = %d, b = %d\n", a, b);

    //卸载dll
    FreeLibrary(hDll);
    return 0;
}

程序运行结果

可以看到,dll是在运行过程中加载的,成功调用了dll中的函数


这里写图片描述
这里写图片描述

到此为止,dll的两种加载方式就讲完了,有的人可能会出现函数导出名不是原来的函数名的问题,那应该是dll编写的时候用的cpp文件,所以vc用的c++语法去编译的原因..我测试的代码用的都是c文件

注 ; 转载请注明来源 enjoy5512的博客 http://blog.csdn.net/enjoy5512

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

结构体的强制类型转换

结构体赋值遇到的一点问题

获取进程列表和模块信息

获取本地进程列表与进程模块信息

通过WINNT.H定义的结构体,获取进程IAT表

利用已定义的PE文件结构体获取本进程的IAT表

Inline Hook

Inline Hooking的实现

IAT HOOK

IAT Hook的实现

内存注入之IAT Hook和Inline Hook综合程序

内存注入综合程序 1) 进程列表获取 2) IAT表项获取 3) IAT Hook 4) Inline Hook

DLL的编写

一个最简单的DLL编写

使用IAT表注入模块到进程中 样例

模块注入到进程的方法有很多,想一一写例子,学习一下,也练习一下!         首先先从IAT表注入开始吧!         如果了解PE文件的格式的话,原理很简单。当一个模块被系统加载起来后,会遍...

DLL注入

DLL注入远程进程

DLL动态库的创建,隐式加载和显式加载

动态库的创建 打开VS,创建如下控制台工程,工程命名为DllTest: 在弹出的对话框中选择“DLL”后单击“完成”按钮: 在工程中新建DllTest.h和DllTest.cpp...
  • dcrmg
  • dcrmg
  • 2016-12-02 20:32
  • 794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)