1。关于dll只一次实例化的问题
我拿vc写了个dll,
里面有个函数int a(int 参数),
vb调用,我在调用的时候循环执行call a(参数),结果发现,dll的内存没有被释放,又在新内存上开辟了,后来,vb的内存就溢出了。。 
我的问题是,如何让dll只运行一个实例?不管vb怎么调用,调用的是同一个dll的函数,而不是从新开辟?我看有DLL_PROCESS_ATTACH,是不是这个我能用?如何用呢?
2。关于static类型变量
是多个dll类共享一个static的变量还是?或者,在dll退出时,static的变量是否会被释放?先请教大家这两个问题,请解答,谢谢拉!!!明白后结贴,不拖拉~~

解决方案 »

  1.   

    我的是win32 Dynamic-Link Library
      

  2.   

    问题是不是出在dll中的代码?你把代码放上来看一看。
      

  3.   

    难道正常情况下系统是不会在新内存上开辟给dll的空间么?
      

  4.   

    用 #pragma section 创建一个共享内存段,在其中放置一个 static bool 变量
    通过该变量来判定是否为第一次加载
      

  5.   

    #pragma data_seg(".shared")
    static bool g_bFirstTime = true;
    #pragma data_seg()
    #pragma comment(linker, "/section:.shared,rws")在 PROCESS_ATTACH 时
    if (g_bFirstTime)
    {
      // 初始化处理
      g_bFirstTime = false;
    }
      

  6.   


    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初始化)
      

  7.   

    程序 2 调用 dll 1,(此时 程序1 已经把 c 改成 5 了,并且程序1 没退出)程序 2 看到 c=1(还是初始值,因为进程间调用同一个DLL互不干扰)。程序 2把 c=改成 8。过一会儿退出了。程序 2 重新启动,调用 dll 1,看到的 c = 1。(即使是同一个程序,每一次运行都是不同的进程)
      

  8.   

    系统的dll本来就只运行一个实例,不管vb怎么调用,调用的绝对是同一个dll的函数。这个无需你去考虑。static类型变量是在某一个进程连接dll期间保持不变。
    ===============
    谢谢各位!
    谢谢icansaymyabc(学习与进步),您讲的太明白了!
    那么,如果我不退出引用dll的那个进程,而把里面的static类型变量lngA变成普通的变量lngA,每次调用call a(),a()中对lngA进行lngA+=1,那么,我是否会得到最终累加的结果就是我调用a函数的次数?还是非static类型的变量在每次调用的时候就被复位了,我得到的只是lngA=1?
      

  9.   

    还有,我如何在vb中访问某win32 dll中的公共变量呢?还是通过函数返回值么?
      

  10.   

    那么,如果不退出引用dll的那个进程,而把里面的static类型变量lngA变成普通的变量lngA,每次调用call a(),a()中对lngA进行lngA+=1,那么,不会得到累加的结果,永远都只得到lngA=1
      

  11.   

    还有,我如何在vb中访问某win32 dll中的公共变量呢?还是通过函数返回值么? VB 里面无法申明 dll 中的变量,你只能在dll中提供存取变量的函数供VB使用。