dll中导出对话框类,资源模板不对

zongfangaozfg 2009-09-25 05:06:55

我在MFC扩展DLL中导出如下类
如果DLL中的对话框模板ID与EXE中的对话框模板ID刚好相等,则显示的是EXE中的对话框
我想显示DLL中的对话框,杂办?

//MyDlg.h 文件:

class AFX_EXT_CLASS CMyDlg : public CDialog
{
//....
//{{AFX_DATA(CMyDlg)
//enum { IDD = IDD_DIALOG1 };
enum { IDD = 1000 }; // 1000
// NOTE: the ClassWizard will add data members here
//....
};

遇到问题:
我把对MyDlg.h 文件给可执行文件编译,遇到 IDD_DIALOG1 未定义
于是,我强行把
//enum { IDD = IDD_DIALOG1 };
改为
enum { IDD = 1000 }; // resourch.h 中,IDD_DIALOG1 =1000

如果EXE项目中,有个对话框模板刚好也是等于1000,那显示的就是EXE中的对话框

...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldjliang 2009-09-25
  • 打赏
  • 举报
回复
在DLL中加入
AFX_MANAGE_STATE(AfxGetStaticModuleState())
可以保证只调用DLL中的资源
zongfangaozfg 2009-09-25
  • 打赏
  • 举报
回复
我试了一下, 在EXE 项目中,如下调用可达到效果
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxSetResourceHandle(GetModuleHandle(_T("sep25.dll")));
CMyDlg dlg;
dlg.DoModal();
AfxSetResourceHandle(GetModuleHandle(NULL));
}
但是人家 EXE 项目中不会记住要这么做的,他只把他当做一个普通类
如果在DLL内部,该如何做?
zongfangaozfg 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bragi523 的回复:]
做资源切换
AfxSetResourceHandle(GetModuleHandle(_T("你的DLL")));
AfxSetResourceHandle(GetModuleHandle(NULL));
[/Quote]
这两句放在哪里呀?
bragi523 2009-09-25
  • 打赏
  • 举报
回复
使用资源之前AfxSetResourceHandle(GetModuleHandle(_T("你的DLL")));

用完之后AfxSetResourceHandle(GetModuleHandle(NULL));
zongfangaozfg 2009-09-25
  • 打赏
  • 举报
回复
楼上的,我是 我在MFC扩展DLL中直接导出 对话框类
你的上面两句,加在哪里?
加在下面的函数里么?加在那个地方?
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("SEP25.DLL Initializing!\n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(Sep25DLL, hInstance))
return 0;
new CDynLinkLibrary(Sep25DLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("SEP25.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(Sep25DLL);
}
return 1; // ok
}
bragi523 2009-09-25
  • 打赏
  • 举报
回复
做资源切换
AfxSetResourceHandle(GetModuleHandle(_T("你的DLL")));
AfxSetResourceHandle(GetModuleHandle(NULL));
fandh 2009-09-25
  • 打赏
  • 举报
回复
在DLL中,必须修改装载的资源!用完后,还要改回来!
zongfangaozfg 2009-09-25
  • 打赏
  • 举报
回复
总不能修改模板的ID值,是之不相等吧
你不能保证自己定义的对话框ID,不许应用程序别人用吧

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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