DLL学习笔记一(DLL导入导出)
创建DLL:
先声明导出函数:使用__declspec(dllexport)
#include"DLLSample.h"
#ifndef _DLL_SAMPLE_H #define _DLL_SAMPLE_H //如果定义了C++编译器,那么声明为C链接方式, //否则编译后的函数名为?TestDLL@@YAXXZ,而并不是TestDLL //则不能通过GetProcAddress()获取函数名,因为无法知道DLL编译后的函数名 //******* //如果编译时用的C方式导出函数,则在导入时也要使用C方式(在应用程序#define _cplusplus) //不然会找不到函数 //******* #ifdef _cplusplus extern "C" { #endif //通过宏来控制是导入还是导出 #ifdef _DLL_SAMPLE #define DLL_SAMPLE_API __declspec(dllexport) #else #define DLL_SAMPLE_API __declspec(dllimport) #endif //导入导出函数声明 DLL_SAMPLE_API void TestDLL(int); //导入导出变量声明 DLL_SAMPLE_API extern int DLLData; // 导出/导入类声明 class DLL_SAMPLE_API DLLClass { public: DLLClass(); void Show(); int Data; }; #undef DLL_SAMPLE_API #ifdef _cplusplus } #endif #endif
编写DLL实现
2014_4_9_DLL.dll
#include<objbase.h> #define _DLL_SAMPLE //声明是导出 #define _cplusplus //声明为C编译方式 #ifndef _DLL_SAMPLE_H #include "DLLSample.h" #endif #include "stdio.h" int DLLData; //APIENTRY声明DLL函数入口点 BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DLLData = 456; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } void TestDLL(int arg) { printf("DLL output arg %d\n", arg); } DLLClass::DLLClass() { Data = 999; } void DLLClass::Show() { printf("DLLClass Show()!\n"); }
显示调用DLL
#include<iostream> #include<Windows.h> using namespace std; typedef void (*LPFUNC)(int); int main() { LPFUNC testFunc; int myData; HINSTANCE hins = ::LoadLibrary("C:\\Users\\Administrator\\Documents\\Visual Studio 2012\\Projects\\2014_4_9_DLL\\Debug\\2014_4_9_DLL.dll"); if(NULL != hins) { cout<<"dll is loaded!"<<endl; } //testFunc = (LPFUNC)GetProcAddress(hins,MAKEINTRESOURCE(1)); testFunc = (LPFUNC)GetProcAddress(hins,"TestDLL"); if(NULL == testFunc) FreeLibrary(hins); else testFunc(123); myData = *(int*)GetProcAddress(hins,"DLLData"); cout<<"get the data:"<<myData<<endl; FreeLibrary(hins); system("pause"); return 0; }
隐式调用DLL
配置路径
Include:C:\Users\Administrator\Documents\Visual Studio 2012\Projects\2014_4_9_DLL\2014_4_9_DLL
Lib:C:\Users\Administrator\Documents\Visual Studio 2012\Projects\2014_4_9_DLL\Debug;
#include<iostream> #define _cplusplus //如果DLL用C方式编译函数,要定义此宏 PS: 为什么?? #include"DLLSample.h" using namespace std; #pragma comment(lib,"2014_4_9_DLL.lib") int main() { DLLClass dc; dc.Show(); cout<<"dc.Data:"<<dc.Data<<endl; TestDLL(345); cout<<"DLLData:"<<DLLData<<endl; system("pause"); return 0; }
DLL学习笔记一(DLL导入导出)的更多相关文章
- 巨杉学习笔记 | SequoiaDB MySQL导入导出工具使用实战
本文来自社区用户投稿,感谢这位小伙伴的技术分享 巨杉数据库架构简介 巨杉数据库作为分布式数据库是计算和存储分离架构,由数据库实例层和存储引擎层组成的.存储引擎层负责数据库核心功能比如数据读写存储以及分 ...
- MongoDB 学习笔记之 MongoDB导入导出
MongoDB数据导入导出: mongoexport: -host 机器 -port 端口 -u 用户名 -p 密码 -d 库名 -c 表名 -f 列名 -o 导出的文件名 -q 查询条件 --csv ...
- 好记性不如烂笔头-linux学习笔记3mysql数据库导入导出
1 数据库文件导出 mysqldump -uroot -p123456 test > 1.sql 2数据库文件导入 mysql -uroot -p123456 test <1.sql 3 ...
- matlab学习笔记4--导入和导出Internet数据
一起来学matlab-matlab学习笔记4 数据导入和导出_4 导入和导出Internet数据 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合 ...
- matlab学习笔记4--导入和导出电子数据表
一起来学matlab-matlab学习笔记4 数据导入和导出_3 导入和导出电子数据表 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用> ...
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar中的类解压后放在运行jar中
前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中 使用7z打开压缩包,查看所有依赖的jar都被解压以包名及class的方式存储在了运行jar中,此时jar的 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中
本文需要参考前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中 上文是导出的运行的依赖jar被放在了子目录中,本文是将依赖jar放在可运行jar的本身,这样发布的 ...
- Android开发笔记:SQLite导入导出数据
SQLite是Android中最方便使用的数据库了,现在看下如何快速的在SQLite中导入导出数据. 首先由于是.NET项目转Android,原有数据库使用的是SQLSERVER,由于项目相同部分结构 ...
随机推荐
- [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Node.js Express 获取request原始数据
app.use(bodyParser.json());客户端请求接口时如果指名请求头类型 为Content-Type=application/jsonbodyParser 会自动将 body 里的 j ...
- bzoj3437 小P的牧场
斜率优化dp 代码 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll ...
- ios blog
转得一个朋友的博客,大家可以看哈(主要时国外的) 主要分开发教程.示例项目.UI设计.问题解决几块. 开发教程: 即便过了入门阶段,还是要经常看看一些不错的实例教程. .http://mobile.t ...
- 03---Net基础加强
多态---虚方法 (子类可以选择重写或者不重写) class Program { static void Main(string[] args) { Chinese cn1 = new Chin ...
- SQL 中逻辑运算符的优先级
三个逻辑运算符: NOT AND OR 它们的优先级依次降低(跟多数的高级程序设计语言的优先级顺序一致) 如果要提升某部分的优先级,可以使用半角括号实现 (这点也跟多数高级程序设计语言一致)
- z/os上的tar和gzip(3)
前面两篇文章分别讲过了如何合并并压缩批量文件,如何解压缩并恢复批量文件, 这些问题解决了之后还剩下一个大问题,如何在网络上传输这些压缩过的文件,如果是linux的话非常简单,制定binary,然后ge ...
- 【Ah20160703】咏叹 By C_SUNSHINE
咏叹 By C_SUNSHINE [试题描述] Salroey拿到了一个1~n的排列A,她想对这个排列进行冒泡排序: counter=0 While A不是升序的 counter=counter+1 ...
- iBatis面试题
1) Ibatis中使用like ‘%#filedName#%’ 时,有什么问题? 在xml映射文件中,如果直接按如上写法,会报异常:java.sql.SQLException: Invalid ar ...
- Awk使用一例:获取ASCII可见字符
要做一个需求, 支持可见特殊字符的密码设置. 首先, 需要获取到所有可见特殊字符. 到网上搜索到 ASCII 字符表格, 并复制到文本文件 vschars.txt: 00 00 0 nul 100 4 ...