转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90643.html

前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从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 = ; // 在入口函数中对变量进行初始化
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 ;
}

第二种是显式链接:

#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();
}

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

DLL入门浅析(3)——从DLL中导出变量的更多相关文章

  1. DLL入门浅析(4)——从DLL中导出类

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90663.html 前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小 ...

  2. DLL入门浅析(5)——使用DLL在进程间共享数据

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的 ...

  3. DLL入门浅析【转】

     1.建立DLL动态库 动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中.在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数 ...

  4. DLL入门浅析(1)——如何建立DLL

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90619.html 初学DLL,结合教程,总结一下自己的所得,希望对DLL初学者们有所帮 ...

  5. DLL入门浅析(2)——如何使用DLL

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90621.html 上文我简单的介绍了如何建立一个简单DLL,下面再我简单的介绍一下如何 ...

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

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

  7. C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

    严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧. C++中使用指针是家常便饭了,也非常的好用,这也是我之所以喜欢C++的原因之一.但是在C#中就强调托管的概念了 ...

  8. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  9. DLL中导出STL模板类的问题

    接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...

随机推荐

  1. chrome浏览的下载扩展程序

    C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Extensions 地址栏输入chrome://extensions/并回车打 ...

  2. Activity中setResult(int resultCode, Intent data)与onActivityResult(int requestCode, int resultCode, Intent data)方法的调用

    关于Activity的生命周期 onCreate(Bundle savedInstanceState):可以进行一些初始化的工作在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方 ...

  3. 关于Linux下面msyql安装后并未设置初始密码,但是登录报错“Access denied for user 'root'@'localhost' (using password: NO)”的解决方案

    如上图:首先我安装mysql的时候并没有设置密码,但是就是登不进去,百度了一下,解决方案如下: 解决方案地址:http://zhidao.baidu.com/link?url=7QvuOKtfRdMT ...

  4. 防止sql注入 参数化解决方案

    StringBuilder strSql=new StringBuilder(); strSql.Append("insert into T_SysLog("); strSql.A ...

  5. linux网络编程常用头文件

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...

  6. Wireshark抓包、过滤器

    查阅于http://blog.sina.com.cn/s/blog_5d527ff00100dwph.html 1.捕捉过滤器 设置捕捉过滤器的步骤是:- 选择 capture -> optio ...

  7. 挂载NTFS

    1.安装ntfs-3g wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz --no-check-certificat ...

  8. C#三种方式实现序列化(转)

    序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 序列化和反序列化最主要的作用有: ...

  9. echarts的使用

    ECharts是一个图形展示控件,基于javascript开发出来的,挺好用的,研究了下. 主页地址:http://echarts.baidu.com/index.html API地址:http:// ...

  10. jQuery操作cookie

    验证jquery的cookie插件时才知道原先文件一直在桌面上放着执行发现没有效果,文件必须放在web服务器下面执行才会生效,晕菜! $.cookie(name,value,{expires: 7,p ...