1。关于dll只一次实例化的问题
我拿vc写了个dll,
里面有个函数int a(int 参数),
vb调用,我在调用的时候循环执行call a(参数),结果发现,dll的内存没有被释放,又在新内存上开辟了,后来,vb的内存就溢出了。。
我的问题是,如何让dll只运行一个实例?不管vb怎么调用,调用的是同一个dll的函数,而不是从新开辟?我看有DLL_PROCESS_ATTACH,是不是这个我能用?如何用呢?
2。关于static类型变量
是多个dll类共享一个static的变量还是?或者,在dll退出时,static的变量是否会被释放?先请教大家这两个问题,请解答,谢谢拉!!!明白后结贴,不拖拉~~
我拿vc写了个dll,
里面有个函数int a(int 参数),
vb调用,我在调用的时候循环执行call a(参数),结果发现,dll的内存没有被释放,又在新内存上开辟了,后来,vb的内存就溢出了。。
我的问题是,如何让dll只运行一个实例?不管vb怎么调用,调用的是同一个dll的函数,而不是从新开辟?我看有DLL_PROCESS_ATTACH,是不是这个我能用?如何用呢?
2。关于static类型变量
是多个dll类共享一个static的变量还是?或者,在dll退出时,static的变量是否会被释放?先请教大家这两个问题,请解答,谢谢拉!!!明白后结贴,不拖拉~~
通过该变量来判定是否为第一次加载
static bool g_bFirstTime = true;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")在 PROCESS_ATTACH 时
if (g_bFirstTime)
{
// 初始化处理
g_bFirstTime = false;
}
1。关于dll只一次实例化的问题
系统的dll本来就只运行一个实例,不管vb怎么调用,调用的绝对是同一个dll的函数。这个无需你去考虑。
如果你每次调用 int a() 看到了内存增加,那么内存泄露是在你的代码里。请检查你的代码,不要怀疑系统对dll管理的有效性。2。关于static类型变量
static类型变量是在某一个进程连接dll期间保持不变。比如说, dll 1 有 static int c=1;
程序 1 调用 dll 1,看到 c= 1; 程序 1把 c=改成 5, 程序1 不退出, 5天后再来看,c值还是5。程序 2 调用 dll 1,(此时 程序1 已经把 c 改成 5 了,并且程序1 没退出)c程序 2 看到 c=1(还是初始值,因为进程间调用同一个DLL互不干扰)。程序 1把 c=改成 8。过一会儿退出了。程序 2 重新启动,调用 dll 1,看到的 c = 1。(即使是同一个程序,每一次运行都是不同的进程)
程序 3 用 LoadLibrary 动态调用 dll 1。此时程序1还在运行,dll1仍在内存里,所以调入速度很快。c当然=1。 程序 3把 c=改成 2。程序3使用 FreeLibrary 把DLL释放。但是因为dll1仍被程序1调用,没被卸出内存。程序3没有退出,又用 LoadLibrary 动态调用 dll 1,此时 c 还是 = 1。 (同一个进程的不同次连接,都会使dll初始化)
===============
谢谢各位!
谢谢icansaymyabc(学习与进步),您讲的太明白了!
那么,如果我不退出引用dll的那个进程,而把里面的static类型变量lngA变成普通的变量lngA,每次调用call a(),a()中对lngA进行lngA+=1,那么,我是否会得到最终累加的结果就是我调用a函数的次数?还是非static类型的变量在每次调用的时候就被复位了,我得到的只是lngA=1?