创建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导入导出)的更多相关文章

  1. 巨杉学习笔记 | SequoiaDB MySQL导入导出工具使用实战

    本文来自社区用户投稿,感谢这位小伙伴的技术分享 巨杉数据库架构简介 巨杉数据库作为分布式数据库是计算和存储分离架构,由数据库实例层和存储引擎层组成的.存储引擎层负责数据库核心功能比如数据读写存储以及分 ...

  2. MongoDB 学习笔记之 MongoDB导入导出

    MongoDB数据导入导出: mongoexport: -host 机器 -port 端口 -u 用户名 -p 密码 -d 库名 -c 表名 -f 列名 -o 导出的文件名 -q 查询条件 --csv ...

  3. 好记性不如烂笔头-linux学习笔记3mysql数据库导入导出

    1 数据库文件导出 mysqldump -uroot -p123456 test > 1.sql 2数据库文件导入 mysql -uroot -p123456 test <1.sql 3 ...

  4. matlab学习笔记4--导入和导出Internet数据

    一起来学matlab-matlab学习笔记4 数据导入和导出_4 导入和导出Internet数据 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合 ...

  5. matlab学习笔记4--导入和导出电子数据表

    一起来学matlab-matlab学习笔记4 数据导入和导出_3 导入和导出电子数据表 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用> ...

  6. ArcGIS案例学习笔记_3_2_CAD数据导入建库

    ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...

  7. [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar中的类解压后放在运行jar中

    前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中 使用7z打开压缩包,查看所有依赖的jar都被解压以包名及class的方式存储在了运行jar中,此时jar的 ...

  8. [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中

    本文需要参考前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中 上文是导出的运行的依赖jar被放在了子目录中,本文是将依赖jar放在可运行jar的本身,这样发布的 ...

  9. Android开发笔记:SQLite导入导出数据

    SQLite是Android中最方便使用的数据库了,现在看下如何快速的在SQLite中导入导出数据. 首先由于是.NET项目转Android,原有数据库使用的是SQLSERVER,由于项目相同部分结构 ...

随机推荐

  1. oracle 内外连接,左连接,右连接 区别

    首先讲解一下 on 与where后面接的条件的区别 on和where条件的区别如下:1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录.2.where条件是在 ...

  2. 每天一个java基础知识--static

    内存总体一共分为了 4个部分(stack segment.heap segment.code segment.data segment) 当我们在程序中,申明一个局部变量的时候,此变量就存放在了 st ...

  3. URAL 1139 City Blocks(数论)

    The blocks in the city of Fishburg are of square form. N avenues running south to north and Mstreets ...

  4. (二)重拾单片机 第一天 LED灯

    由图知道 低电平 亮,高电平 灭 控制第一个 LED1 亮灭程序代码,如下 #include<reg52.h> #define uchar8 unsigned char #define u ...

  5. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  6. 夺命雷公狗---DEDECMS----14dedecms首页导航条的完成

    我们的首页完成了,那么下一步就开始创建一个模型了, 添加好电影模型后我们来给他添加一些字段,这些字段主要还是要看我们的项目需求来添加的,因为我们的项目里有: 我们在项目中要用得上这些字段,所以要对他们 ...

  7. 仅支持webkit浏览器的多行内容超出显示省略号

    .box { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; ...

  8. zw版【转发·台湾nvp系列例程】HALCON EquHistoImage(Delphi)

    zw版[转发·台湾nvp系列例程]HALCON EquHistoImage(Delphi) zw版[转发·台湾nvp系列例程]HALCON EquHistoImage(Delphi) (Delphi ...

  9. 【Winfrom】简单的焦点设置问题

    原文: http://blog.csdn.net/zlwzlwzlw/article/details/8573921 初始的时候希望指定控件的焦点 不能用load事件 要用Activated事件才行 ...

  10. ipseccmd命令解析

    IPSec 首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了.TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大.下面就说说如何在命令行下控制IPSec. XP系统用 ...