一个大难题!令人崩溃!dll中调用对话框,对话框中树形控件加载菜单程序立即崩溃!

热爱生活 2014-06-08 10:55:50
这段代码在基于对话框下的树形控件加载菜单程序运行正常:
 CMenu menu;//定义下面要用到的cmenu对象  
menu.LoadMenu(IDC_POPMENU);//装载自定义的右键菜单
/获取第一个弹出菜单,所以第一个菜单必须有子菜单
CPoint oPoint;//定义一个用于确定光标位置的位置
GetCursorPos(&oPoint);//获取当前光标的位置,以便使得菜单可以跟随光标
menu.pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this); //在指定位置显示弹出菜单

而在dll中调用对话框,对话框中树形控件加载菜单程序立即崩溃:
当调用这句话时:
 
menu.GetSubMenu(0->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this); //程序很恐怖地崩溃了,很吓人!

网上查了一下,有人说是因为dll加载资源的问题,不知道如何解决?周末加了两天班,也没有搞定,所以才来请教高手!
请大家指教!非常感谢!!
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
热爱生活 2014-06-11
  • 打赏
  • 举报
回复
谢谢大家! 用这个方法解决的! HINSTANCE save_hInstance = AfxGetResourceHandle(); AfxSetResourceHandle(theApp.m_hInstance); //这里的theApp是与工程同名的类名称 CDialog dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框 dlg.DoModal(); //方法2的状态还原 AfxSetResourceHandle(save_hInstance);
热爱生活 2014-06-08
  • 打赏
  • 举报
回复
在线等您回复!
热爱生活 2014-06-08
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
DLL使用纯C接口,保证DLL和EXE无法使用某个函数直接控制对方的资源 例如需要DLL内某个窗口的某个参数,就调用DLL提供的一个纯C函数,该函数内进行GetSubMenu等操作
非常感谢您的回复! 能够给与更详细的指导? 请您直接告诉我。我该如何修改我的代码呢? 非常着急......请您务必指教!谢谢。。
baichi4141 2014-06-08
  • 打赏
  • 举报
回复
DLL使用纯C接口,保证DLL和EXE无法使用某个函数直接控制对方的资源 例如需要DLL内某个窗口的某个参数,就调用DLL提供的一个纯C函数,该函数内进行GetSubMenu等操作
baichi4141 2014-06-08
  • 打赏
  • 举报
回复
引用 2 楼 ateng5921 的回复:
[quote=引用 1 楼 baichi4141 的回复:] DLL使用纯C接口,保证DLL和EXE无法使用某个函数直接控制对方的资源 例如需要DLL内某个窗口的某个参数,就调用DLL提供的一个纯C函数,该函数内进行GetSubMenu等操作
非常感谢您的回复! 能够给与更详细的指导? 请您直接告诉我。我该如何修改我的代码呢? 非常着急......请您务必指教!谢谢。。[/quote] 以上就是我的意见,未必帮得上你,仅供参考
baichi4141 2014-06-08
  • 打赏
  • 举报
回复
引用 2 楼 ateng5921 的回复:
[quote=引用 1 楼 baichi4141 的回复:] DLL使用纯C接口,保证DLL和EXE无法使用某个函数直接控制对方的资源 例如需要DLL内某个窗口的某个参数,就调用DLL提供的一个纯C函数,该函数内进行GetSubMenu等操作
非常感谢您的回复! 能够给与更详细的指导? 请您直接告诉我。我该如何修改我的代码呢? 非常着急......请您务必指教!谢谢。。[/quote] 简单的说,你的DLL所提供的功能能否被一个纯C控制台程序所调用?如果能,那就没问题,如果你的DLL提供的功能必须在一个MFC程序中才能使用,那就有问题。 例如DLL中有一个对话框,那么所有对这个对话框的操作都要在DLL内完成,调用这个DLL的程序只能和DLL交互基本类型数据,哪怕DLL传出一个对话框指针给程序,这个程序也只能以void*类型接收这个指针并传给DLL的某个函数使用,绝不允许在DLL外将这个指针转为对话框指针后进行操作
fly4free 2014-06-08
  • 打赏
  • 举报
回复
难道是: AFX_MANAGE_STATE(AfxGetAppModuleState());
Dobzhansky 2014-06-08
  • 打赏
  • 举报
回复
资源类的 win32 api 函数都带有一个 HINSTANCE 作为资源提供者. MFC 默认从程序资源中加载, 你应该在你的 dll 中加载 但是 CMenu 没有指定 HINSTANCE 的方式. 看看 AfxGetResourceHandle AfxSetResourceHandle AfxFindResourceHandle 函数.
_船长_ 2014-06-08
  • 打赏
  • 举报
回复
既然崩溃了,那就调试呗,看一下调用堆栈,定位一下大概的错误地方

15,471

社区成员

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

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