博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态与动态加载Dll [示例代码]
阅读量:6282 次
发布时间:2019-06-22

本文共 1663 字,大约阅读时间需要 5 分钟。

1、DLL源代码

MyDll.h

[cpp]
  1. // 
  2. // MyDll.h 
  3. // 声明函数 
  4. int _stdcall Add(int a,int b); 
  5. int _stdcall Sub(int a,int b); 
// // MyDll.h // 声明函数 int _stdcall Add(int a,int b); int _stdcall Sub(int a,int b);

 

MyDll.cpp

[cpp]
  1. // 
  2. // MyDll.pp 
  3. // 声明实现 
  4. #include "MyDll.h" 
  5. int _stdcall Add(int a,int b) 
  6.     return a+b; 
  7. int _stdcall Sub(int a,int b) 
  8.     return a-b; 
// // MyDll.pp // 声明实现 #include "MyDll.h" int _stdcall Add(int a,int b) { return a+b; } int _stdcall Sub(int a,int b) { return a-b; }

 

MyDll.def

[cpp]
  1. ; MyDll为工程名 
  2. LIBRARY MyDll 
  3. ; 在这里声明需要导出的函数 
  4. EXPORTS 
  5. Add 
  6. Sub 
; MyDll为工程名 LIBRARY MyDll ; 在这里声明需要导出的函数 EXPORTS Add Sub

 

2、Exe测试代码

演示动态与静态加载的方法,看代码吧!

[cpp]
  1. void CTestDlg::OnBtnStatic()  
  2.     // TODO: Add your control notification handler code here 
  3.     // 静态加载的方法: 
  4.     // 1、添加头文件 #include "MyDll.h" 
  5.     // 2、引入Lib库  #pragma comment(lib,"MyDll.lib") 
  6.     // 3、这样就可以直接使用MyDll.h中导入的函数 
  7.     CString str; 
  8.     str.Format("静态加载: 1+1=%d 1-1=%d",Add(1,1),Sub(1,1)); 
  9.     MessageBox(str); 
  10. void CTestDlg::OnBtnDynamic()  
  11.     // TODO: Add your control notification handler code here 
  12.     // 动态加载的方法: 
  13.     // 不需要引入头文件与lib文件,仅需要一个dll即可 
  14.     // 注意这里的条约调用约定_stdcall不要忘记加(不然会引会esp出错) 
  15.      
  16.     typedef int (_stdcall *ADDPROC)(int,int); 
  17.     typedef int (_stdcall *SUBPROC)(int,int); 
  18.     HINSTANCE handle; 
  19.     handle = LoadLibrary("MyDll.dll"); 
  20.     if(handle) 
  21.     { 
  22.         // GetProcAddress第二个参数有两种方法: 
  23.         // 1、通过DLL中的函数名 
  24.         // 2、通过Depend工具中Ordinal索引值来查看 
  25.         ADDPROC MyAdd = (ADDPROC)GetProcAddress(handle,"Add"); 
  26.         SUBPROC MySub = (ADDPROC)GetProcAddress(handle,MAKEINTRESOURCE(2)); 
  27.         if( !MyAdd ) 
  28.         { 
  29.             MessageBox("函数Add地址获取失败!"); 
  30.             return
  31.         } 
  32.         if( !MySub ) 
  33.         { 
  34.             MessageBox("函数Sub地址获取失败!"); 
  35.             return
  36.         } 
  37.         CString str; 
  38.         str.Format("动态加载: 1+1=%d 1-1=%d",MyAdd(1,1),MySub(1,1)); 
  39.         MessageBox(str); 
  40.     } 
  41.     FreeLibrary(handle); 

转载地址:http://qenva.baihongyu.com/

你可能感兴趣的文章
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
Java 5 特性 Instrumentation 实践
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>