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 打赏 收藏 转发到动态 举报
写回复
用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; }

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧