创建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. bnuoj 44359 快来买肉松饼

    http://www.bnuoj.com/contest/problem_show.php?pid=44359 快来买肉松饼 Time Limit: 5000 ms     Case Time Lim ...

  2. JSP文件编码

    1. pageEncoding: <%@ page pageEncoding="UTF-8"%> jsp页面编码: jsp文件本身的编码 2. contentType: ...

  3. 2.session与cookie的区别?

    session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cook ...

  4. XStream xml转java对象

    1:引入jar qn <dependency> <groupId>xstream</groupId> <artifactId>xstream</a ...

  5. 夺命雷公狗---DEDECMS----10dedecms双标签

    双标签基本语法如下: {dede:标签名 参数名=“值” 参数名2=“值”...} 内容...... {/dede} 我们先来查看下手册,如下所示: 我们先来用一个channel的标签来做实例,因为c ...

  6. 白盒测试的学习之路----(五)TestNG的参数分离

    之前的测试用例直接嵌套在代码中,不便于维护和测试设计,应该单独把测试用例放在excel内,然后程序从中读取数据到相应的接口内即可.使用ava程序对Microsoft Office格式档案读和写的功能提 ...

  7. BPM 应用系统开发案例实战

    概述 IBM BPM 的前身是 Lombardi,是由 IBM 于 2009 年收购的产品,之后产品更名为 IBM WebSphere Lombardi Edition,目前最新版本称为 IBM BP ...

  8. 什么是商业智能BI和实施BI的解决方案【转】

    商业智能,或BI,是一种统称,泛指用于对一个企业的原始数据进行分析的各种各样的软件系统.商业智能(BI)是由若干相关的活动组成的领域,包括数据挖掘,在线分析处理,查询和报表. 企业用商业智能(BI)来 ...

  9. redis 笔记06 发布与订阅、事务、慢查询日志、监视器

    发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...

  10. scala模拟一个timer

    直接上代码: package com.test.scalaw.test.demo import java.util.Date /** * 模拟一个定时timer */ object Timer { d ...