资源描述:
《创建显示对话框的dll》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、创建显示对话框的DLL现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。这里我们从Win32DLL和MFCDLL两个方面来分析并解决这个问题。一.Win32DLL在Win32DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件。然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义你自己的对话框回调函数处理对话框收到的消息。1)在VC菜单中F
2、ile->New新建一个命名为UseDlg的Win32Dynamic-LinkLibrary工程,下一步选择AsimpleDLLproject。2)在VC菜单中Insert->Resource添加一个ID为IDD_DLG_SHOW的Dialog资源,将此Dialog上的Cancel按钮去掉,仅保留OK按钮。再添加一个ID为IDD_ABOUTBOX的对话框,其Caption为About。保存此资源,将资源文件命名为UseDlg.rc。并将resource.h和UseDlg.rc加入到工程里面。3)在Use
3、Dlg.app中包含resource.h,并添加如下代码:HINSTANCEhinst=NULL;HWNDhwndDLG=NULL;BOOLCALLBACKDlgProc(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);BOOLCALLBACKAboutProc(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);extern"C"__declspec(dllexport)voidShowDlg();BOOLAP
4、IENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH:hinst=(HINSTANCE)hModule;caseDLL_PROCESS_DETACH:break;}returnTRUE;}extern"C"__declspec(dllexport)voidShowDlg(){hwndDLG=CreateDialog(hi
5、nst,MAKEINTRESOURCE(IDD_DLG_SHOW),NULL,(DLGPROC)DlgProc);ShowWindow(hwndDLG,SW_SHOW);}BOOLCALLBACKDlgProc(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_INITDIALOG:returnTRUE;caseWM_COMMAND:if(LOWORD(wParam)==IDOK)DialogBox(hinst,
6、MAKEINTRESOURCE(IDD_ABOUTBOX),hDlg,(DLGPROC)AboutProc);returnTRUE;caseWM_CLOSE:DestroyWindow(hDlg);hwndDLG=NULL;returnTRUE;}returnFALSE;}BOOLCALLBACKAboutProc(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_CLOSE:EndDialog(hDlg,NUL
7、L);hwndDLG=NULL;returnTRUE;}returnFALSE;}4)编译生成UseDlg.dll和UseDlg.lib。二.MFCDLL在MFC应用程序框架中,MFC定义了多种状态信息,例如模块状态、进程状态、线程状态等,这些状态信息是MFC程序特有的,普通Win32程序并没有这引些状态的定义。在Windows中模块的含义:一个EXE文件或者一个DLL。但只有MFC程序才有模块状态、进程状态、线程状态这些概念,因为这些数据结构是在MFC中定义的,而不操作系统定义的!MFC定义的“模块状
8、态”包括这样一些信息:当前模块的路径、用来加载资源的Windows实例句柄、指向当前CWinApp或者CWinThread对象的指针、OLE模块的引用计数、Windows对象与相应的MFC对象之间的映射。MFC通过也为每个线程定义了“线程状态”,像“模块状态”一样是通过TLS技术实现的,在此不再详述。但我们要知道“线程状态”里定义了指向有效模块状态的指针,每当进入某个模块时应该使它指向有效模块状态,这对维护应用程序全局状态和每个模块状态的完