程序是这样的:
一个主程序A可以调用DLL B,
一个DLL C 也可以调用B
B也可以调用C于是当A调用B之后,B中又调用C,C又回头来调用B时就会出现错误。这时候要如何判断B是否已经在运行?

解决方案 »

  1.   

    dll本身就是共享用的  不同内存控件调用相同dll没问题  关键可能是你用完没释放
      

  2.   


    B还是使用中怎么能释放呢?
    这里面是B和C互相调用的时候才会出错,C是要通过B调用的(当然还有其它地方也可以调用C,只是就这个问题而言),但是C又可以调用B,所以这时候就必须要避免B和C互相调用的情况,从而需要判断B是否已经运行,也就是说判断C是不是通过B调用出来的
      

  3.   

    如果这些DLL的调用都可以约定采用显示调用,那么可以再建立一个管理的DLL,在该DLL当中采用单例(Singleton)输出一个管理实例,然后所有显示调用DLL都通过该管理实例进行加载,对于已经加载的DLL采用增加计数的形式处理,对于释放时,则先扣减计数,计数为0时,再释放。
      

  4.   

    DLL 里用个命名的事件,互斥对象控制就行,进入对象的建立 ,然后判断下
    另外也可以遍历进程,然后遍历进程加载DLL做判断,不过效率没前者高 
      

  5.   


    我的意思是利用互斥等来让这个DLL只能被一个调用, 控制调用DLL的代码地方或者DLL入口都可以 
    DELPHI用互斥来防止程序多开的代码,你去找下看下
      

  6.   

    你的“运行”是什么概念?已经加载?正在调用里面的函数?判断是否已经加载的话是没必要的,直接LoadLibrary就是了,因为WINDOWS会自动维护一个引用计数的,无论你LOAD多少次,返回的都是同一个HANDLE的。如果是后者的话,就如上所述考虑互斥吧。不过我倒觉得你这个循环调用的DLL结构有问题,考虑把相互调用的部分抽出来作为独立的DLL?
      

  7.   

    补充:如果实在要判断DLL是否加载的话,可以用GetModuleHandle
      

  8.   

    通过GetModuleHandle来判断相应的DLL是否加载了,
    你的问题可能是循环调用引起的...,先把各个DLL之间的逻辑关系摆顺