DLL 导出变量
声明为导出变量时,同样有两种方法:
   第一种是用__declspec进行导出声明
#ifndef _DLL_SAMPLE_H
#define _DLL_SAMPLE_H // 如果定义了C++编译器,那么声明为C链接方式
#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 extern int DLLData; #undef DLL_SAMPLE_API #ifdef __cplusplus
}
#endif #endif
第二种是用模块定义文件(.def)进行导出声明
LIBRARY DLLSample
DESCRIPTION "my simple DLL"
EXPORTS
DLLData DATA ;DATA表示这是数据(变量)
下面是DLL的实现文件:
#include "stdafx.h"
#define _DLL_SAMPLE #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 = 123; // 在入口函数中对变量进行初始化
break
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
同样,应用程序调用DLL中的变量也有两种方法。
第一种是隐式链接:
#include <stdio.h>
#include "DLLSample.h" #pragma comment(lib,"DLLSample.lib") int main(int argc, char *argv[])
{
printf("%d ", DLLSample);
return 0;
}
第二种是显式链接:
#include <iostream>
#include <windows.h> int main()
{
int my_int;
HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll"); if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
my_int = *(int*)GetProcAddress(hInstLibrary, "DLLData");
if (dllFunc == NULL)
{
FreeLibrary(hInstLibrary);
}
std::cout<<my_int;
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
通过GetProcAddress取出的函数或者变量都是地址,因此,需要解引用并且转类型。
DLL 导出变量的更多相关文章
- dll的概念 dll导出变量 函数 类
		
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接 ...
 - DLL入门浅析(3)——从DLL中导出变量
		
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90643.html 前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从DLL中导出 ...
 - DLL  导出函数
		
DLL的链接方式分为两种:隐式链接和显式链接 DLL导出的函数 和 导出类在调用时,有些区别,这里暂时不讲,直说简单的导出函数: 隐式链接: #include "stdafx.h" ...
 - DLL导出类避免地狱问题的完美解决方案
		
DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...
 - DLL的概念、dll导出类(转贴)
		
1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链 ...
 - C++ DLL导出类 知识大全
		
在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...
 - MFC   DLL   导出函数的定义方式
		
一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...
 - DLL导出函数和类的定义区别 __declspec(dllexport)
		
DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...
 - AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源
		
AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: .创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID如下: ...
 
随机推荐
- UVa 793 - Network Connections
			
题目大意:给出计算机之间的连接配置,询问某两台计算机是否相连.判断两个点是否在同一个连通分量里,用并查集处理. #include <cstdio> #define MAXN 1000000 ...
 - 【Xilinx-Petalinux学习】-08-OpenAMP系统实现
			
openAMP系统实现. 一个核跑Linux,一个核裸跑. -----> 已经实现. 一个核跑Linux,一个核跑UCOS -----> 还未实现. Micrium的uco ...
 - 分析java堆
			
内存溢出(OutOfMemory) OOM 堆溢出 直接内存溢出 永久区溢出
 - [项目回顾]基于Redis的在线用户列表解决方案
			
迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...
 - Win10還原成最乾淨的狀態 不必重灌
			
系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...
 - IOS 使用GCD改善性能
			
1.GCD介绍 GCD:Grand Central Dispathch,核心中央调度,是一种异步技术.但是它是系统级的. 负责管理队列,是线程之上的抽象层.队列可以并行或串行运行,能够在系统级自动管理 ...
 - VS2013 F12无法转到函数的定义处,总是从“元数据”获取的问题 ——解决方法
			
右键项目名称-->点击菜单中的"添加"-->点击"引用"-->在弹出窗中点击"解决方案"下的"项目", ...
 - 9 Python+Selenium鼠标事件
			
[环境信息] python3.6+Selenium3.0.2+Firefox50.0+win7 [ActionChains类鼠标事件的常用方法] 1.右击:context_click() 2.双击:d ...
 - HTML/CSS/JavaScript学习总结(转)
			
HTML 网站开发的主要原则是: – 用标签元素HTML描述网页的内容结构: – 用CSS描述网页的排版布局: – 用JavaScript描述网页的事件处理,即鼠标或键盘在网页元素上的动作后的程序 H ...
 - permutation test