创建显示对话框的DLL
来源:互联网 发布:淘宝上冰毒暗语 编辑:程序博客网 时间:2024/06/05 16:09
现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题。
一.Win32 DLL
1)在VC菜单中File->New新建一个命名为UseDlg的Win32 Dynamic-Link Library工程,下一步选择A simple DLL project。
2)在VC菜单中Insert->Resource添加一个ID为IDD_DLG_SHOW的Dialog资源,将此Dialog上的Cancel按钮去掉,仅保留OK按钮。再添加一个ID为IDD_ABOUTBOX的对话框,其Caption为About。保存此资源,将资源文件命名为 UseDlg.rc。并将resource.h和UseDlg.rc加入到工程里面。
3)在UseDlg.app中包含resource.h,并添加如下代码:
HINSTANCE hinst = NULL;
HWND hwndDLG = NULL;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) void ShowDlg();
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
}
extern "C" __declspec(dllexport) void ShowDlg()
{
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
}
BOOL CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
}
4)编译生成UseDlg.dll和UseDlg.lib。
二.MFC DLL
1、“静态链接到MFC库的”DLL
2、“动态链接到MFC库的”DLL
方法一:在每个导出函数的第一语句前加上宏:AFX_MANAGE_STATE(AfxGetStaticModuleState())
方法二:在每个导出函数的第一语句前加上代码:
HINSTANCE save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);
在每个导出函数的最后加上代码:
AfxSetResourceHandle(save_hInstance);
方法三:由应用程序自身切换
//获取EXE模块句柄
HINSTANCE exe_hInstance = GetModuleHandle(NULL);
//或者HINSTANCE exe_hInstance = AfxGetResourceHandle();
//获取DLL模块句柄
HINSTANCE dll_hInstance = GetModuleHandle("SharedDll.dll");
AfxSetResourceHandle(dll_hInstance); //切换状态
ShowDlg(); //此时显示的是DLL的对话框
AfxSetResourceHandle(exe_hInstance); //恢复状态
在MFC扩展DLL中使用AFX_MANAGE_STATE(AfxGetStaticModuleState());时,会产生如下错误:
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
注意:
1、Windows API要创建对话框,就必须找到正确的对话框资源,这是本文的核心。
2、显示对话框的DLL有时会出现bug: 在Debug状态下显示后就死在那里!
- 创建显示对话框的DLL
- 创建显示对话框的DLL
- 创建显示对话框的DLL
- 创建导出对话框的dll
- 【MFC】创建显示对话框的DLL(共享DLL问题分析解决)
- DLL中创建的非模式对话框不能正常显示原因的解决
- 创建显示对话框的DL
- 调用dll显示对话框
- 非模态对话框的创建及显示
- MFC非模态对话框的创建及显示
- MFC对话框的创建和显示
- 向导模式对话框的创建和显示
- mfc 非模态对话框的创建与显示
- 以DLL形式加载的自动更新的显示对话框
- 显示DLL中的非模态对话框
- dll创建无模式对话框
- Win32 DLL中创建对话框
- vc dll中创建对话框
- 3.MR输入格式和分片相关
- spfa ,就邻接表建图模板
- c++ 面向切面变成 aop 通用模板
- iOS-上传错误之ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法
- 单线程无锁读写缓存
- 创建显示对话框的DLL
- extjs 事件参数,不加,就要使用绝对引用
- 5.MR多文件的输入输出
- 理解jquery的$.extend()、$.fn和$.fn.extend()
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
- 4.MR老版流程源码解析
- IOS 系统定位提示完毕后 提示用户去开启定位权限
- iOS项目中常用的第三方开源库
- 从头认识java-13.3 泛型接口的使用