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,由于项目相同部分结构 ...
随机推荐
- Ruby On Rails经典书籍下载地址
Web开发敏捷之道-应用Rails进行敏捷Web开发 http://vdisk.weibo.com/s/t47M5Q3WInwc RUBY ON RAILS入门经典 http://downlo ...
- editPlus修改默认的文件编码
- 用Commons-FileUpload组件实现文件上传
需要用到Tomcat还有commons-fileupload-1.3.1.jar包和commons-io-2.4.jar包. 如果需要传一个文件,form表单必须有enctype="mult ...
- MVC4中给TextBoxFor设置默认值和属性
例如:(特别注意在设置初始值的时候 Value 中的V要大写) @Html.TextBoxFor(model => model.CustomerCode, new { Value=" ...
- python 笔记1
Python join()方法 描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 ...
- 1.js基础
1.如何在html文档中使用js 1)使用<script></script>将JS语法嵌入到html中,可以使用多个,每个之间都是有关联的 2)href="javas ...
- HorizontalScrollView的配置
package com.exmple.jinritoutiao; import java.util.ArrayList;import java.util.Calendar;import java.ut ...
- Python标准库之核心模块学习记录
内建函数和异常 包括__builtin__模块和exceptions模块 操作系统接口模块 包括提供文件和进程处理功能的os模块,提供平台独立的文件名处理(分拆目录名,文件名,后缀等)的os.path ...
- scala模式匹配
package com.ming.test /** * 模式匹配 */ object MatchTest { def main(args: Array[String]): Unit = { //mat ...
- 精通 JS正则表达式
一.正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 替换文本.可以在文档中使用一个正则表达式 ...