创建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. With as 递归查询

    use TEST create table Provinces ( pro_Id ,), pro_Name nvarchar(), pro_Code nvarchar(), pro_PId int ) ...

  2. 利用Hudson持续集成来执行Android自动化测试(转)

    当你套用Athrun.Robotium等框架,针对自己的项目写完了一堆自动化测试脚本后,在Eclipse之外怎么让它们可以持续性地跑起来并展现报告呢? 据我了解,方便的方法大致有两个:其一,利用Hud ...

  3. 使用PHP发送邮件

    使用封装SMTP协议的邮件类 使用PEAR扩展中的Mail类,功能强大:可以支持纯文本.HTML格式的邮件:各字段都可设置编码,正确配置不会出现中文乱码情况:可以支持附件等等. 在服务器可以使用 pe ...

  4. 封装pdo单例模式类

    <?php /** * MyPDO * @author Jason.Wei <jasonwei06@hotmail.com> * @license http://www.sunblo ...

  5. 互联网分享知识(一转载 http://www.cnblogs.com/baochuan/p/4636103.html)

         风雪之隅-Laruence的博客 http://www.laruence.com/ PHP开发组成员, Zend兼职顾问, PHP7核心开发者, Yaf, Yar, Yac等项目作者.偏向P ...

  6. GitHub和SourceTree入门教程——(转载),希望能帮到有需要的人

    -->本教程适用于主流的开源网站github和bitbucket,个人认为sourceTree还是比较好用的git客户端,支持windows和mac os. -->soureceTree的 ...

  7. Linux mail 命令参数

    linux mail 命令参数: 使用mail发邮件时,必须先将sendmail服务启动. mail –s “邮件主题” –c”抄送地址” –b “密送地址” -- -f 发送人邮件地址 –F 发件人 ...

  8. FRM-92101解决办法

    /u02/UAT/inst/apps/UAT_newerp3/logs/ora/10.1.3/opmn/forms_default_group_1/ http://blog.csdn.net/orth ...

  9. 夺命雷公狗---微信开发59----在线点播电影网1之ckplayer播放器

    我们节课程就要开始写一个小项目了,这项目主要是写一个在线点播电影影网的,我们用到的播放器是ckplayer ckplayer基本介绍: ckplayer的全称是:超酷flv播放器,他是一款用于网页上播 ...

  10. 清华大学出版社即将推出的又一本挂羊头卖狗肉的劣书 《C语言入门1.2.3—一个老鸟的C语言学习心得》

    http://www.tup.com.cn/book/showbook.asp?CPBH=051892-01