需要在一常规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();
}
...全文
242 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()中,这时对话框的模板等已经读出了.

16,472

社区成员

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

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

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