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>);
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
- Days in Dll (二)
- Days in DLL(一)
- Days 27 百度地图(二)
- in younger days
- IoT in 5 days
- days
- Sams Teach Yourself MySQL in 21 Days
- Teach Yourself ADO.NET in 21 Days
- Sams Teach Yourself J2EE in 21 Days
- Sams Teach Yourself EJB in 21 Days
- Launching a Blog Successfully in 15 Days
- 【转】Teach yourself C++ in 21 Days.
- Prune days and Change Capture in DAC
- get days in month use javascript
- No update in recent two days!
- rest 2.5days in a week
- Find the difference between two days in days, months and years
- MFC DLL向导(二)
- UIDevice
- 非聚集索引
- 第166天
- 怎么制定一套合适的服务器命名方案
- HDU4950:Monster
- Days in Dll (二)
- mysql--字符串拼接
- java栈的应用:实现括号匹配检测
- 编程练习题
- No WebApplicationContext found: no ContextLoaderListener registered错误
- 交叉编译Mesa,X11lib,Qt opengl 补充
- Grub2引导LinuxISO进行系统安装及救援
- Mapreduce 小例子
- sublime中安装插件emmet , zen-coding,emmet css snippets 两种html/css编辑利器