需要在一常规DLL中显示对话框

leoleo 2000-09-13 10:45:00
需要在一常规DLL中显示对话框,在DLL导出函数中加入afx_manage_state宏,
对话框却显示不出来,并导致可怕的非法操作,为什么?
extern __declspec(dllexport) void showeditdialog( )
{
afx_manage_state(afxgetstaticmodulestate());
cmylocaldialog dlg;
dlg.domodal();
}
...全文
240 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
andygood 2000-09-16
  • 打赏
  • 举报
回复

不可能!我的软件全部都是采用通常DLL(C接口),从来没用过什么特殊的东西。以下代码摘自我的程序:

#define DLLAPI __declspec(dllexport)
// 注:引入时,#define DLLAPI __declspec(dllimport)

////////////////////////////////////////////////////////////
DLLAPI void ShowAbout()
////////////////////////////////////////////////////////////
{
CAboutDlg().DoModal();
}// End of function.

建议老兄搞清楚DLL的类型及使用方法先。
Holly 2000-09-16
  • 打赏
  • 举报
回复
andygood的方法是可以显示对话框的,但如果对话框中有AfxGetMainWnd()之类的语句就会出错!要使之不出错,只能使用MFC扩展DLL,如果有人不明原因,我会解答给你!
playpcgame 2000-09-15
  • 打赏
  • 举报
回复
关注!
halbert 2000-09-15
  • 打赏
  • 举报
回复
关注
Holly 2000-09-14
  • 打赏
  • 举报
回复
介绍一下DEBUG如何不行!
leoleo 2000-09-14
  • 打赏
  • 举报
回复
确实静态连接可以编译,但我需要动态连接啊,
另外,才发现一怪现象,Realease版可以编译通过,
并且程序运行正常,而Debuge版却无论如何都不行,
难道VC有问题?
bulehawk 2000-09-13
  • 打赏
  • 举报
回复
注意:如果又对话框资源的话。一定要选择静态连接後在编译才可以

坎坷的菜贩 2000-09-13
  • 打赏
  • 举报
回复
弄错了,应该是extern "C"
坎坷的菜贩 2000-09-13
  • 打赏
  • 举报
回复
我做了个最简单的对话框试了一下,结果……很正常啊,不知你的对话框有何不寻常之处?(是否往里面添加了ActiveX控件?)
另外__declspec(dllexport)前面好像不用加extern吧。
Holly 2000-09-13
  • 打赏
  • 举报
回复
如果你必须用常规的DLL,建议你用SDK来实现Dialog,就是DialogBox(...)宏函数;

DialogBox (hinst, MAKEINTRESOURCE (IDD_MYDIALOG), NULL, (DLGPROC)MyDlgFunc);
坎坷的菜贩 2000-09-13
  • 打赏
  • 举报
回复
楼上的老兄,题目上说的是“常规”而非扩展DLL啊。
hzylhx 2000-09-13
  • 打赏
  • 举报
回复
上一期的
程序员大本营中有一段,希望对你有帮助

当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,必须保存DLL的实例,可以通过AfxInitExtensionModule

static AFX_EXTENSION_MODULE extensionDLL;

extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(extensionDLL, hInstance))
return false;
}

return(true);
}
然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保存exe的资源,以便以后正确恢复
void get_DLL_resource(void)
{
/* this function changes the resource handle to that of the DLL */
//这个函数改变资源句柄使其指向DLL
if (resource_counter == 0)
{
save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(extensionDLL.hModule);
}

resource_counter++;
}
接着你需要其它函数来恢复资源句柄

void reset_DLL_resource(void)
{
/* this function restores the resource handle set by
'get_DLL_resource()' */

if (resource_counter > 0)
resource_counter--;

if (resource_counter == 0)
AfxSetResourceHandle(save_hInstance);
}
接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.
第12章 实例278——创建导出浮点数四则运算函数的Win32 DLL 实例279——使用显式方式调用DLL实现浮点数的四则运算 实例280——使用隐式方式调用DLL实现浮点数的四则运算 实例281——创建Win32 DLL导出一个全局变量 实例282——调用DLL,获取其导出的全局变量值 实例283——创建Win32 DLL导出一个计算长方体表面积和体积的类 实例284——调用DLL,使用其导出类计算长方体的表面积和体积 实例286——创建MFC常规DLL,通过导出函数显示颜色信息对话框 实例287——调用MFC常规DLL显示颜色信息对话框 实例288——创建MFC扩展DLL,实现圆形按钮类 实例289——调用MFC扩展DLL,创建圆形按钮 实例290——创建记录键盘动作的全局钩子DLL 实例291——调用键盘钩子DLL,实现监视系统的键盘操作 实例292——创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL 实例293——调用鼠标钩子DLL显示鼠标所在窗口的标题 实例294——获取当前操作系统的版本信息 实例295——获取系统CPU信息 实例296——获取系统内存的相关信息 实例297——获取当前系统所有安装的硬件设备 实例298——调用系统关机对话框 实例299——编码实现关闭和重启计算机 实例300——实现休眠计算机,并创建快捷键 实例301——显示并设置系统的显示属性 实例302——隐藏显示系统的任务条 实例303——改变系统的桌面壁纸

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧