Days in Dll (二)

来源:互联网 发布:单词读音的软件 编辑:程序博客网 时间:2024/05/17 01:27

1, 显式加载DLL

1), 根据名称 访问导出函数

直接上菜:

#include "stdio.h"#include <Windows.h>int main(){HINSTANCE hInst;hInst = LoadLibrary("SimpleDll.dll");typedef int(*ADDPROC) (int a, int b);ADDPROC Add = (ADDPROC)GetProcAddress(hInst, "add");if (!Add){printf("error");}elseprintf("1 + 2 = %d", Add(1,2));char ch;scanf("%c", &ch);}<pre name="code" class="cpp">
首先得说的是 LoadLibrary,  它表示加载dll, 返回一个被加载模块的句柄, 

而GetProcAddress表示获取加载导出函数的地址, 我的理解是, 在汇编中 函数其实是一串执行指令,如果获得函数的地址, 即是获取函数的入口。 当然 第二个参数表示的是加载的函数名称, 这也牵涉到上文中的名字改编问题, 这个我是用def解决的。

其次就是细节, 

比如typedef那一行中, 表示的是用ADDPROC修饰的函数 类型是int function (int a, int b),

而且, 对于用_stdcall等修饰的函数, 类似于typedef int (_stdcall *ADDPROC) (int a, int b);的修改方式

2) 根据序号 访问导出函数:

其实大致函数与上文相似, 只是在GetProcAddress位置稍作修改。

ADDPROC Add=(ADDPROC)GetProcAddress(hInst,<span style="color:#ff0000;"> MAKEINTRESOURCE(1)</span>);


对于MAKEINTRESOURCE(1),   其实, 每个导出函数都有其序号, 通过dumpbin查看simpleDll。:

ordinal hint    RVA       name    1    0    00011082    add = @ILT+125(?add@@YAHHH@Z)    2    1    00011190    minus = @ILT+395(?minus@@YAHHH@Z)
其中ordinal栏, 即是表示函数的序号值, 而MAKEINTRESOURCE(1), 表示的是序号为1的资源, 即是add函数。


no lib, no h, just load it.

优点: 使用时才加载, 资源浪费少;   调用隐蔽。。。。

P.S.  释放引用dll:   FreeLibrary(HINSTANCE);


二, 共享DLL

一般情况下, 就算是加载同一个DLL, 程序对DLL里面的全局变量进行修改, 其他程序所读到的全局变量的值是不变的。 (详情请百度: 写入时复制)

这样就不能达到共享DLL的目的了。

这里我们得使用 共享节。

我们可以创建一个 “节”, 把要共享的数据放入其中, 再设置其权限 “RWS”  “ReadWriteShare”, 这样就达到共享的目的了。

具体内容如下:

//shareDll.h#ifndef DLLAPI #define DLLAPI _declspec(dllimport)#endif#pragma data_seg("MySeg")//这俩个段之间存放共享数据int a = 0;#pragma data_seg()//设置其权限#pragma comment (linker, "/section:MySeg,RWS")/*关于权限设置  也可以在def文件中添加:LIBRARY ShareDll  //library according to the project nameSEGMENTSMySeg READ WRITE SHARED*/int DLLAPI getA();void DLLAPI addA(int b);


//shareDll.cpp#define DLLAPI _declspec(dllexport)#include "shareDll.h"int getA(){return a;}void addA(int b){a += b;}



//shareDllTest.cpp#include "include\\shareDll.h"#pragma comment(lib, "include\\shareDll.lib")#include "stdio.h"int main(){char chs;printf("a is %d\n", getA());scanf("%c", &chs);addA(1);printf("after addA(1), a is %d\n", getA());scanf("%c", &chs);return 0;}

启动程序俩次, 发现确实修改了A的值, 共享成功。


0 0