是这样的,我自己建了一个DLL文件,内部有一个窗体类,软件运行后首先会通个这个类用DoModal()新建一个模态窗口。后来我又想新建一个更新功能,想法是如果软件更新时用户正占用这个DLL并且停在这个窗体,那么,首先就关闭这个窗体,释放DLL,然后更新这个DLL即可。问题是,想关闭它必须知道它的句柄。这个句柄怎么找呢?
     我想这样关闭它:SendMessage(FindWindow(_T("loginframe"),NULL),WM_CLOSE,NULL,NULL);因为我之前是这样建立它的Cloginframe loginframe;
loginframe.DoModal();思考是不行,关不了,我不想这样:
SendMessage(FindWindow(NULL,_T("窗口标题")),WM_CLOSE,NULL,NULL);
因为我以后可能会更改标题,这样太麻烦,而且容易忘记改。
请高手指教!DLL 窗体 句柄 关闭 VC软件

解决方案 »

  1.   

    DLL与你的EXE是怎么通讯的?
    函数嘛,对不对?
    即然是函数句柄就不能传了?
    如果你静态链那个DLL,那更简单,直接把名柄放在全局变量中,那边的EXE 直接extern 声明一下,就能直接获取。
    如果你的是EXE,那就要开共享内存CreateFileMapping,MapViewOfFile 等。
      

  2.   

    我不是静态链的,是用LoadLibrary()加载DLL文件然后GetProcAddress()获取函数这样动态加载的。我的想法是这样的,那个关闭窗体的函数的窗体类都在一个DLL文件中,当然,关闭窗体的函数不是窗体类的类成员函数。是另外定义的。什么时候要关闭窗体了,调用这个函数,这个函数通过SendMessage()发送WM_CLOSE消息给窗体,窗体关闭。现在主要的是窗体句柄怎么获取,头大了。
      

  3.   

    你的DLL提供个函数,比如叫 CloseLoginFrame,那样不行吗?
      

  4.   

    Cloginframe在创建窗口时,把窗口句柄,保存在一个全局变量中,Cloginframe的窗口关闭时,把这这个全局变量设为空,这样有问题吗?
      

  5.   

    感谢你的回答,已经解决了,用这句可以实现:SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,NULL,NULL);