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如下: ...
随机推荐
- 使用flexbox来布局web应用
使用 flexbox 可以帮助你设计出引人注目的布局,并且在pc端或移动端能够很好的缩放.告别使用浮动的 <div> 元素.绝对定位 和一些JavaScript hacks, 使用仅仅几行 ...
- UVa 10523 - Very Easy !!!
题目大意:给你一个公式,直接按照式子计算就可以了,要用到大数. import java.io.*; import java.util.*; import java.math.*; class Main ...
- Django中扩展Paginator实现分页
Reference:https://my.oschina.net/kelvinfang/blog/134342 Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包.要在Dj ...
- shell 脚本连接mysql数据库查询database中表的数量和表名
#!/bin/bash MYSQLHOST="127.0.0.1" MYSQLUSER="root" MYSQLPWD="root" MYS ...
- Linux FTP 服务器配置简单说明
一. FTP 说明 linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol. 还有一个是proftp(Profession ftp ...
- ceentos5.5 配置samba服务&用户&组
准备 Change Root Password passwd root 在提示下建立新密码 静态IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 #网络 ...
- 电商网站垮IDC数据备份,MySql主从同步,图片及其它数据文件的同步
原文网址:http://www.bzfshop.net/article/180.html 对一个电子商务网站而言,最宝贵的资源就是数据.服务器是很廉价的东西,即使烧了好几个也问题不大,但是用户数据如果 ...
- gdb命令整理
Microsoft Windows XP [版本 ] (C) 版权所有 - Microsoft Corp. C:\Documents and Settings\Administrator>e: ...
- iOS开发之内存缓存机制
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...
- Eclipse 输入出错时自动查找类
经常会只记得类的前半部分名称,这时可以双击这个没写完的类名,然后会弹出选择框: