我在一个进程中有很多线程都调用了DLL中的函数,现在我想FreeLibrary这个动态库。可是怎么知道这个DLL有没有被别的线程使用。我做了一个试验,如果有线程在使用DLL中的函数时强行FreeLibrary动态库,系统会报错的。

解决方案 »

  1.   

    LOADLIBRARY时不是有个句柄吗?你记住它,谁释放之前看下是否为NULL,不是就释放,然后置NULL
      

  2.   

    那还不如直接在进程中装载,最后在进程中释放,线程只调用 handle
    或者将handle作为全局变量,只装载一次
      

  3.   

    回joachern(程序人生):
    因为我的业务应用要求经常更新动态连接库,但是又不能停止进程。因此,我准备在更新时候先把链接库换个文件名,然后调用LoadLibrary获得一个新句柄,接着用新句柄替换老的句柄。这样可以保证正在引用动态链接库的线程不会受到影响。最后我要把老的句柄释放掉,可是我却不知道那个老的链接库是不是还在被别的线程引用阿。
    回Skt32(荒城之月):
    如果还有别的线程正使用动态链接库中的函数,直接释放的话,系统会报错的。
      

  4.   

    直接终止自己的程序,等dll更新后重新运行不就得了
      

  5.   

    有一个DLL引用记数的问题,对于不同的进程A,B,如果同时装载了DLL c,那么这个DLL在两个进程中的引用记数分别是1;如果有A调用了FreeLibrary...,那么A进程中DLL c的引用记数将变成0,c从A进程地址空间中撤消,但仍然存在于进程B的地址空间中且引用记数依然是1;如果楼主说的其他的线程是指另外一个进程中的线程.......说了半天废话,试试调用GetModuleHandle查看指定DLL是否被加载到了进程的地址空间中......;楼主能详细谈谈报错的情况吗?谢谢;
      

  6.   

    http://www.skin-studio.com
        有的时候,我们开发了一套很有市场价值的软件,可是发觉市场销售量却很低,原来真正的原因是软件的包装不够漂亮。公司采取各种渠道来解决问题。招聘大量的美工人员,可是,却发觉程序员的水平跟不上步伐,专门设立一个研究部门,却发觉需要花费巨额的人力物力,采用第三方控件吧,却要支费大量的注册费用或者版权使用费用,而且一般都以动态链接库*.DLL 或者控件*.OCX 绑定到我们的软件中。并且,控件功能扩展需要花费一定的升级费用才能够实现。您希望一次花费为数不多的费用就能弥补所有的不足吗...皮肤类不以任何形式的控件*.OCX,动态链接库*.DLL出售给用户,所以,你不必担心是否以源代码的方式出售给用户
        皮肤工作室皮肤类(VC开发企业版)暑假期间正在热销中,优惠活动截至到2003.9月。售价仅仅人民币500元整(终身使用版权);并且,在功能上可以任意扩展,真可谓手到擒来。具体包括皮肤对话框,皮肤按扭,皮肤进度条,皮肤控制条,皮肤动画标签类,皮肤面版类... 全部功能都以源代码的方式出售,使你可以制作真正意义上的具有自主版权皮肤功能的软件,还在等什么,赶快行动吧!!!
       真正令我们心动的时刻到了,同时随送的一些经典皮肤示例源代码包括多彩取色机XP,鼠标记录机,多彩影音伴侣等等
    你如果希望购买我们的产品,请到我们网站的购买方式页面 http://www.skin-studio.com/bankcard.htm了解更多信息
      

  7.   

    DLL的引用记数已经由系统来维护了;
      

  8.   

    在DLL中添加某种同步机制;进程获得   才可以卸栽;
      

  9.   

    #pragma data_seg(".inidata")
    int m_iDllCount = 0;
    #pragma data_seg()int GetDllRefenceCount()
    {
    return m_iDllCount;
    }
    //
    // DLL 入口函数,对DLL调用次数进行统计。
    //
    BOOL WINAPI DllMain(
    HINSTANCE hModule, 
        DWORD ul_reason_for_call, 
        LPVOID lpReserved
    )
    {
    if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
    InitializeCriticalSection(&gCriticalSection);
    EnterCriticalSection(&gCriticalSection);
    {
    m_iDllCount ++;
    }
    LeaveCriticalSection(&gCriticalSection); }
    else if(ul_reason_for_call == DLL_PROCESS_DETACH)
    {
    EnterCriticalSection(&gCriticalSection);
    {
    m_iDllCount -- ;
    }
    LeaveCriticalSection(&gCriticalSection); } return TRUE;
    }建立一个全局的计数器,Attach时加,Detach时减。导出GetDllRefenceCount函数,如果得到的值为零,^_^,不就可以了Free了??
      

  10.   

    同意 leepyzh(leepyzh) 
    #pragma data_seg(".inidata")
    int m_iDllCount = 0;
    #pragma data_seg()
    这样写在所有调用线程中只有一个m_iDllCount存在。