社区
进程/线程/DLL
帖子详情
DLL多次动态加载的问题。做过的进来看~!
wind_xu
2007-02-08 04:57:08
一个动态链接库,再程序中需要多次加载。但是每次加载的时候我需要通过导出函数Init, new 一个Object.
g_pObject = new Object();
g_pObject是全局变量,而由于DLL的特性,使得第二次调用Init的时候g_pObject已经被第一次的Init调用付了值。也就是说每次DLL被动态加载的时候g_pObject是同一个地址。
有什么办法可以让g_pObject在每次加载的时候都有不同的地址呢?
...全文
880
18
打赏
收藏
DLL多次动态加载的问题。做过的进来看~!
一个动态链接库,再程序中需要多次加载。但是每次加载的时候我需要通过导出函数Init, new 一个Object. g_pObject = new Object(); g_pObject是全局变量,而由于DLL的特性,使得第二次调用Init的时候g_pObject已经被第一次的Init调用付了值。也就是说每次DLL被动态加载的时候g_pObject是同一个地址。 有什么办法可以让g_pObject在每次加载的时候都有不同的地址呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
grefen
2011-08-21
打赏
举报
回复
把这个g_pObject = new Object(); 放到dll外面就可以了,如果dll里面用,通过参数传进来就可以了
xxq123321
2011-08-01
打赏
举报
回复
每次要不同的地址除了new还有什么办法?
如果这是考虑g_object已经被赋值,那增加一个类似reset的方法就行了
funny_li
2011-07-27
打赏
举报
回复
最简单的办法就是:把你要加载的dll,先改名复制,再加载。即:把他看成不同的dll。
luhifeng
2011-07-22
打赏
举报
回复
解决了么,这个问题
littlegang
2007-03-21
打赏
举报
回复
简单啊
有个函数可能大家不大用,所以不熟悉
TlsAlloc,可用于在dll中为每个Thread分配不同的存储区
也就是说,TlsAlloc一个相同的编号,对于不同Thread来说,其内容是不一样的
lz可以把g_pObject要保存的对象比如编为常量 #define GLOBALOBJECT 1
每个Thread用TlsGetValue(GLOBALOBJECT)就可以得到不同的object啦
具体MSDN
Using Thread Local Storage in a Dynamic-Link Library
WingForce
2007-02-27
打赏
举报
回复
感觉lz这个问题可以考虑线程本地存储
双杯献酒
2007-02-27
打赏
举报
回复
你可以在DLL中做一个 NewObj 函数,
只Load一次, 多次 NewObj
Jarrylogin
2007-02-26
打赏
举报
回复
看看COM组件中的引用计数,比较好的方法
luoxiangdong
2007-02-26
打赏
举报
回复
我遇到过同样的问题,同一个dll不需要加载多次,加载多次也没意义,因为系统只有第一次会真正加载,dll 中的全局数据数据无法正常使用.
long CreateInterface()
{
Obj* m_s=new Obj();
return (long)m_s;
}
long TerminateInterface(long handle)
{
Obj* m_s=((Obj*)handle);
delete m_s;
return 0;
}
long Dosomething(long handle)
{
return ((Obj*)handle)->dosomething();
}
这样的方式使用即可避免全局量的冲突
UDX协议
2007-02-14
打赏
举报
回复
在同一进程中是同一地址,不同进程中,是不同的地址。
linuxpgy
2007-02-12
打赏
举报
回复
Init 改名叫CreateNewObject() ,嘿嘿~~~~
sevencat
2007-02-09
打赏
举报
回复
每次加载的时候把老的删掉,再创 个。
wind_xu
2007-02-09
打赏
举报
回复
没人有办法吗?
wind_xu
2007-02-08
打赏
举报
回复
我只是在找一种方法,使得每次动态加载DLL就像通过new产生一个实例一样。
peterxuxu
2007-02-08
打赏
举报
回复
DLL一般都不会有问题如果你是纯的DLL那么用LoadLibaray,应该就不存在冲突问题了
crumpy
2007-02-08
打赏
举报
回复
那维护一个g_pObjList的列表呢?
wind_xu
2007-02-08
打赏
举报
回复
这样确实没有问题。但是无法满足我的要求啊!
crumpy
2007-02-08
打赏
举报
回复
要是不用全局变量呢, 直接:
Object* Init(){ return new Object; }
最好还提供一个释放的函数: void Free(Object* pObj){ delete pObj; }
改变隐式
加载
dll
路径的方法(不修改环境变量)
问题
: 今天我遇到了这样一个需求:随着代码的累计,
dll
越来越多了,想将exe所有依赖的
dll
放到子目录中,保持软件顶级目录的整洁. 但有个一限制条件--不能修改环境变量PATH.对于使用LoadLibrary
加载
的
dll
还好办,只需要修改
dll
所在的路径即可.但对于那些隐式
加载
的
dll
却无法分离(有些
dll
要么导出了大量的函数,如果使用LoadLibrary+GetProcAddess的方式工...
DLL
原理(
动态
链接程序库)
DLL
原理(
动态
链接程序库) 概述 编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件;然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重...
Labview调用外部
DLL
时遇到的
问题
和注意事项
目前网上有很多关于如何在Labview中调用的教程文档,本文档只介绍我再实际测试过程中遇到的
问题
及注意事项 1.编写
Dll
时函数的前缀需要加上 extern “C” _declspec(
dll
export) 否则labview的
Dll
函数编辑中会出现函数名称不对的情况,头文件及cpp中都要添加上。 2.在Labview编写例程的过程中,
多次
出以下错误: 调用库函数节点"************":库未找到或者未
加载
①主要是labview编辑的参数类型一定要与
dll
函数编辑的参数类型对应上,详细类型对应自
dll
动态
链接库文件编写
1.
动态
链接库(
dll
)概述 没接触
dll
之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其他
dll
调用来完成某项工作的函数,只有在其他模块调用
dll
中的函数时,
dll
才发挥作用。 在实际编程中,我们可以把完成某项功能的函数放在一个
动态
链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在
dll
中,
C/C++
动态
链接库(
dll
)文件解析
1.
动态
链接库(
dll
)概述 没接触
dll
之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其他
dll
调用来完成某项工作的函数,只有在其他模块调用
dll
中的函数时,
dll
才发挥作用。 在实际编程中,我们可以把完成某项功能的函数放在一个
动态
链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在
dll
中,如Kernel32.
dll
, User32.
dll
, GDI32.
dll
等。那么
dll
究...
进程/线程/DLL
15,472
社区成员
49,183
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章