声明为导出变量时,同样有两种方法:
   第一种是用__declspec进行导出声明

  1. #ifndef _DLL_SAMPLE_H
  2. #define _DLL_SAMPLE_H
  3.  
  4. // 如果定义了C++编译器,那么声明为C链接方式
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8.  
  9. // 通过宏来控制是导入还是导出
  10. #ifdef _DLL_SAMPLE
  11. #define DLL_SAMPLE_API __declspec(dllexport)
  12. #else
  13. #define DLL_SAMPLE_API __declspec(dllimport)
  14. #endif
  15.  
  16. // 导出/导入变量声明
  17. DLL_SAMPLE_API extern int DLLData;
  18.  
  19. #undef DLL_SAMPLE_API
  20.  
  21. #ifdef __cplusplus
  22. }
  23. #endif
  24.  
  25. #endif

第二种是用模块定义文件(.def)进行导出声明

  1. LIBRARY DLLSample
  2. DESCRIPTION "my simple DLL"
  3. EXPORTS
  4. DLLData DATA DATA表示这是数据(变量)

下面是DLL的实现文件:

  1. #include "stdafx.h"
  2. #define _DLL_SAMPLE
  3.  
  4. #ifndef _DLL_SAMPLE_H
  5. #include "DLLSample.h"
  6. #endif
  7.  
  8. #include "stdio.h"
  9.  
  10. int DLLData;
  11.  
  12. //APIENTRY声明DLL函数入口点
  13. BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  14. {
  15.  switch (ul_reason_for_call)
  16.  {
  17.   case DLL_PROCESS_ATTACH:
  18. DLLData = 123; // 在入口函数中对变量进行初始化
  19. break
  20.   case DLL_THREAD_ATTACH:
  21.   case DLL_THREAD_DETACH:
  22.   case DLL_PROCESS_DETACH:
  23.    break;
  24.  }
  25.  return TRUE;
  26. }

同样,应用程序调用DLL中的变量也有两种方法。
第一种是隐式链接:

  1. #include <stdio.h>
  2. #include "DLLSample.h"
  3.  
  4. #pragma comment(lib,"DLLSample.lib")
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8.  printf("%d ", DLLSample);
  9.  return 0;
  10. }

第二种是显式链接:

  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. int main()
  5. {
  6. int my_int;
  7. HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");
  8.  
  9. if (hInstLibrary == NULL)
  10. {
  11. FreeLibrary(hInstLibrary);
  12. }
  13. my_int = *(int*)GetProcAddress(hInstLibrary, "DLLData");
  14. if (dllFunc == NULL)
  15. {
  16. FreeLibrary(hInstLibrary);
  17. }
  18. std::cout<<my_int;
  19. std::cin.get();
  20. FreeLibrary(hInstLibrary);
  21. return(1);
  22. }

通过GetProcAddress取出的函数或者变量都是地址,因此,需要解引用并且转类型。

DLL 导出变量的更多相关文章

  1. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  2. DLL入门浅析(3)——从DLL中导出变量

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90643.html 前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从DLL中导出 ...

  3. DLL 导出函数

    DLL的链接方式分为两种:隐式链接和显式链接 DLL导出的函数 和 导出类在调用时,有些区别,这里暂时不讲,直说简单的导出函数: 隐式链接: #include "stdafx.h" ...

  4. DLL导出类避免地狱问题的完美解决方案

    DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...

  5. DLL的概念、dll导出类(转贴)

    1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链 ...

  6. C++ DLL导出类 知识大全

    在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...

  7. MFC DLL 导出函数的定义方式

    一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...

  8. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  9. AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源

    AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: .创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID如下: ...

随机推荐

  1. 使用flexbox来布局web应用

    使用 flexbox 可以帮助你设计出引人注目的布局,并且在pc端或移动端能够很好的缩放.告别使用浮动的 <div> 元素.绝对定位 和一些JavaScript hacks, 使用仅仅几行 ...

  2. UVa 10523 - Very Easy !!!

    题目大意:给你一个公式,直接按照式子计算就可以了,要用到大数. import java.io.*; import java.util.*; import java.math.*; class Main ...

  3. Django中扩展Paginator实现分页

    Reference:https://my.oschina.net/kelvinfang/blog/134342 Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包.要在Dj ...

  4. shell 脚本连接mysql数据库查询database中表的数量和表名

    #!/bin/bash MYSQLHOST="127.0.0.1" MYSQLUSER="root" MYSQLPWD="root" MYS ...

  5. Linux FTP 服务器配置简单说明

    一.  FTP 说明 linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol. 还有一个是proftp(Profession ftp ...

  6. ceentos5.5 配置samba服务&用户&组

    准备 Change Root Password passwd root 在提示下建立新密码 静态IP vi /etc/sysconfig/network-scripts/ifcfg-eth0  #网络 ...

  7. 电商网站垮IDC数据备份,MySql主从同步,图片及其它数据文件的同步

    原文网址:http://www.bzfshop.net/article/180.html 对一个电子商务网站而言,最宝贵的资源就是数据.服务器是很廉价的东西,即使烧了好几个也问题不大,但是用户数据如果 ...

  8. gdb命令整理

    Microsoft Windows XP [版本 ] (C) 版权所有 - Microsoft Corp. C:\Documents and Settings\Administrator>e: ...

  9. iOS开发之内存缓存机制

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  10. Eclipse 输入出错时自动查找类

    经常会只记得类的前半部分名称,这时可以双击这个没写完的类名,然后会弹出选择框: