目前开发一组态软件X.exe的驱动程序A.dll(win32), 有现成的测点枚举驱动B.dll可供使用(其实这里我是必须要使用的),在A.dll中调用B.dll中某一枚举框函数时,程序会重新好几次重新计入A.dll的WinMain函数,而且被调用的枚举框最终还是会产生,但最终导致程序异常。我感觉是X.exe调用A.dll出现了问题而产生了重复调用(原因肯定是A.dll加载B.dll的函数时引起的,未调用B.dll函数时正常)。
    现在我就产生了一个疑问:Win32 dll能否调用MFC dll,MFC调用MFC dll好像有切换机制,如AFX_MANAGE_STATE(AfxGetStaticModuleState()),但Win32 中我不知道对应的是什么函数?是否没有?
    请高手给小弟解释解释,不胜感激啊!

解决方案 »

  1.   

    MFC规则DLL只是在DLL内部使用了MFC,对外接口的定义和标准DLL一样的。AFX_MANAGE_STATE(AfxGetStaticModuleState())是设置MFC框架的状态的,Win32 API的和资源有关的API都要指定Module(EXE、DLL模块)的,MFC封装的函数把这个参数省了,使用MFC框架上下文中设置的当前Module
      

  2.   

    kyotrue:那我在调用B.dll的函数时,应该怎么做呢? 
      

  3.   

    DLL没有WinMain函数的,只有DllMain
      

  4.   

    BOOL WINAPI DllMain(
        HINSTANCE hinstDLL,  // handle to DLL module
        DWORD fdwReason,     // reason for calling function
        LPVOID lpReserved )  // reserved
    {
        // Perform actions based on the reason for calling.
        switch( fdwReason ) 
        { 
            case DLL_PROCESS_ATTACH:
             // Initialize once for each new process.
             // Return FALSE to fail DLL load.
                break;        case DLL_THREAD_ATTACH:
             // Do thread-specific initialization.
                break;        case DLL_THREAD_DETACH:
             // Do thread-specific cleanup.
                break;        case DLL_PROCESS_DETACH:
             // Perform any necessary cleanup.
                break;
        }
        return TRUE;  // Successful DLL_PROCESS_ATTACH.
    }
    如果是隐式加载DLL:
    DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH只有程序开始、结束时各一次;DLL_THREAD_ATTACH、DLL_THREAD_DETACH可能有多次。
    一般情况下,初始化操作都只在DLL_PROCESS_ATTACH中进行
      

  5.   

    不好意思,是DLLMain,自己写错了!
      

  6.   

    kyotrue:现在情况是B.DLL的枚举框出现了,但伴随着DLLMain的多次进入,最后出现程序挂掉,感觉很异常;而当不调用B.DLL函数时没有该现象发生。这是什么情况呢? 
      

  7.   

    哪个DLL的DLLMain多次进入?是在初始化时进入,还是调用函数后进入?
      

  8.   

    如果要防止多次进入,B.DLL可以做一些标志检测,发现对话框已经显示了,后面再次调用就返回,不要再显示对话框.