社区
进程/线程/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在每次加载的时候都有不同的地址呢?
...全文
993
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; }
C++ STL 学习 :for_each与仿函数(functor)
C++ STL 学习 :for_each与仿函数(functor)(一)摘自网络作者: zieckey 时间: 2010-07-20 13:38:00先看wikipedia定义:
A function object, also called a functor, functional, or functionoid,[1] is a computer programming construct allowing an object to be invoked or called like it
java 仿函数,C++ STL 学习 :for_each与仿函数(functor)(一)
C++ STL 学习 :for_each与仿函数(functor)(一)By zieckey( All right reserved!)先看wikipedia定义:A function object, also called a functor, functional, or functionoid,[1] is a computer programming construct allowing...
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章