转:动态链接库的全局变量问题

动态链接库的全局变量问题

请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢?
你这个问题得分被调用的是同一个进程还是不同的进程。如果是不同的进程,那么你的动态连接库就完全是重新加载的。因为动态连接库是被映射到调用的那个进程的空间里的,而不同的进程有不同的地址空间,所以不同进程调用同一个DLL基本就没什么关系,除非你声明了一些变量在共享数据段,这样这些变量就会在不同的进程间共享。

如果你同一个进程多次LoadLibrary,就不一定会重新初始化,事实上Windows是这样运作的。他为动态连接库创建一个变量用来记录被Load的次数,在一个进程中每次LoadLibrary这个引用计数就会加1,每次FreeLibrary这个引用记录就会减1,当计数变为0时,Windows则完全释放这个DLL,这时候你再一次加载,那么所有初始化的工作就会重新来一遍。如果你加载已经在程序其他地方加载过的DLL,那么就不会初始化。

保存状态可以保存到文件,保存到注册表等。
提问者评价
很详细,谢谢啦!也谢谢其他热心的朋友^_^
时间: 2024-11-10 11:40:27

转:动态链接库的全局变量问题的相关文章

-Bsymbolic: 优先使用本地符号

问题描述 前段时间项目开发中,实现了一个动态库,封装了一些方法.然后基于这个动态库,实现了一个应用程序.应用程序中含有全局变量A,动态库中也含有全局变量A,当我调用动态库中函数后,发现应用程序的A发生了变化!!!O,My God!对于我这种还没在Linux下做过开发的人来说,一头雾水...... 于是我尝试着,将A中的变量名称改为B,这样问题也就没有了~~~ 原因 应用程序进行链接的时候,动态库中全局变量定义,将会被应用程序中同名的全局变量所覆盖.这样也就造成了,在动态库中修改A变量时,应用程序

C语言全局变量那些事儿(深入C中最隐秘的地带)

[虽然自认为对C的角角落落都有所了解,但直到看到这篇文章,才知道C中的一些隐秘的坑,是自己之前不知道的. 关于全局变量的链接问题,之前在我博客的某文章中有介绍过,一般对C有些了解的程序员都知道这个问题,但本文最后所提到的使用动态链接库所出现的问题,着实让我震惊. (心急的朋友,可跳过前面的,直接读"第4个例子") 所以,以后大家在使用全局变量的时候要留点心,良好的命名规范,在一定程度上可以避免文中所提到的隐秘Bug. 文章略长,请大家耐心读完,一定会有收获的! ] 以下为转载内容(额,

C++ 根据操作系统版本调用不同的动态链接库

在操作数据库时遇到一个问题:win7 sp1上编译ADO程序,在win7 sp1以下版本不能运行,(Win7系统下需要的动态文件与XP系统的需要的动态链接库不一样.需要根据系统的版本加载动态链接库.) Win7 系统下: 需要的动态链接库 #import "MSADO15.DLL" rename_namespace("ADOWE") rename("EOF","EndOfFile") Win XP下 #import "

(转载)DLL动态链接库编程入门之二:非MFC DLL

上一节中讲解的是DLL概论及其调试和查看,本节将为大家详解非MFC DLL的相关内容.  1.一个简单的DLL 上一节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数. 如图1,在VC++中new一个Win32 Dynamic-Link Library工程dllTest.注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是后面要讲述的MFC动态链接库. 图1 建立一个非MFC DLL 在

动态链接库管理

ldconfig 是一个动态链接库管理命令.为了让动态库为系统所共享,还需要运行动态链接库的管理命令 --ldconfig. ldconfig 命令的用途主要是在默认搜索目录 (lib 和 /usr/lib)以及动态库的配置文件 /etc/ld.so.conf 内所列的目录下,搜索出可以共享的动态链接库 (格式如: libxxx.so* ),进而创建出动态载入程序所需的连接和缓存文件,缓存文件默认为 /etc/ld.so.cache. 此文件保存已排好顺序的动态链接库名字列表. ldconfig

Android SO(动态链接库)UPX加固指南

前言 随着移动互联网的爆发性增长,人们对移动应用的需求变得越来越复杂,企业在带给用户众多便利和享受的同时,却容易忽视应用自身的安全性问题,一旦遭受攻击,就会给企业和用户的经济或声誉带来影响.本文主要是站在企业的角度,阐述如何通过给android SO(动态链接库)加壳来提升移动APP的安全性,减少SO被逆向反汇编分析的风险. 注:本文只做单方面的总结,如果对整体提升移动应用安全性有需求的人员,可参考作者另外一份文档:<移动应用安全开发指南v1.0(Android)>. 撰写本文的目的: 1. 

动态链接库dll简介

前言 最近发现,自己在电脑之中做了好多技术笔记,但这些关于自己的总结仅限于在自己电脑中,没有与其他人分享交流(虽然也上传到百度文库中),这其实对于做IT的很不好,应该多于别人交流分享,不仅有助于发现自己对某些知识理解上的一些不足和缺陷,还有助于提高沟通交流能力,而且有时你会发现会有意外收获的哦! 其实很早就开通了博客,之前也写过一些博客,但好久没有写过博客了,于是就想利用博客,把自己以前写过的笔记整理一下,跟大家分享一下,共同交流学习,笔记中有什么错误或者不足的地方,希望大家能够提出宝贵的意见和

MinGW gcc 生成动态链接库 dll 的一些问题汇总

网络上关于用 MinGW gcc 生成动态链接库的文章很多.介绍的方法也都略有不同.这次我在一个项目上刚好需要用到,所以就花了点时间将网上介绍的各种方法都实验了一遍.另外,还根据自己的理解试验了些网上没有提到的方法.这里,我就将这两天获得的成果总结一下. 首先说一下我的开发环境: gcc version 4.9.2 (Rev1, Built by MSYS2 project) Target: i686-w64-mingw32 Thread model: posix --disable-sjlj-

Windows XP 系统自带扑克牌资源动态链接库cards.dll逆向分析笔记

使用工具:IDA Pro, Resource Hacker 0. 前言 cards.dll是Windows系统目录下的一个动态链接库,主要提供扑克牌图像及相关操作等资源,以供 Windows附带的扑克游戏程序(如纸牌.红心大战等)使用. 我们希望知道cards.dll具体提供了哪些东西,可供自由编程所用. 1. 反编译 一般而言,将原始二进制文件还原成高级语言源文件的逆向工程有两个步骤:一是反编译,根据目 标文件反汇编的内容,识别指令.存储单元等基本要素并理解这些要素之间的相互关系,从而写出相应