请教关于dll中函数内的static变量

danceflying2003 2004-09-29 02:54:59
在一个dll中的函数内定义
static int i=0;
.................
i++;
多次调用dll中的该函数后发现每次i都是0
i作为静态变量在dll中被还有其他的副本吗?
请指点一二。。
...全文
238 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
danceflying2003 2004-09-29
  • 打赏
  • 举报
回复
知道怎么回事了。。
我说的两个g()是在两个不同的进程里的。所以都会有自己进程的静态存储区,因此不会++.
小弟对dll的理解不太正确,感谢各位的帮助。
下面是我找的一段资料:
在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。Windows操作系统对DLL的操作仅仅是把DLL映射到需要它的进程的虚拟地址空间里去。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有.
roger_ding 2004-09-29
  • 打赏
  • 举报
回复
只要dll不释放,而且是在同一个进程内部调用,i的值就会递增,如果出错,可能是你的代码哪里把i的值给改了
李马 2004-09-29
  • 打赏
  • 举报
回复
首先,你必须保证调用的代码不是我上面所说的那样调用完了就把DLL释放掉——这样不管有几份代码都是一个效果。
其次,如果你的两个g()不是在同一个进程中,那么DLL的实例也就会有两个。这时候推荐你使用DLL的共享段。
再次,你能不能把详细情况说一下,以便对症下药:)
danceflying2003 2004-09-29
  • 打赏
  • 举报
回复
如果两个g()同时在调用f()呢?
这时候应该只有一份f()的代码啊
李马 2004-09-29
  • 打赏
  • 举报
回复
假如是这样:
// DLL代码
void f()
{
static int i;
// ...
}
// EXE代码
void g()
{
HMODULE hDLL = LoadLibrary(...);
// 在这里执行函数f
FreeLibrary(hDLL);
}
经历这个过程,由于DLL总是会在最后被Free掉,所以static变量也会被销毁,i自然也每次都是0了。

15,471

社区成员

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

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