mainwnd = ::AfxGetMainWnd();怎么得到的是NULL?请高手指点。

lxw_6 2001-08-10 08:34:26
我有一个应用程序调用了一个DLL,在DLL中有这么一个语句:

CWnd *mainwnd;
mainwnd = ::AfxGetMainWnd();

当我的应用程序设置Use MFC in a Static Dll 时上面语句中的mainwnd得到的是NULL,

当我的应用程序设置Use MFC in a Shared Dll 时上面语句中的mainwnd得到的是主窗口的指针。

请问这是什么原因呢?有什么解决办法,使我用Static连接时也能得到正确的值呢?
盼望高手指点。
...全文
630 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
AriDo 2001-08-14
  • 打赏
  • 举报
回复
我懂了,现在的人只要解决方法不要知道是为什么,很好很好。
zhengyun_ustc(^-^) 没有分太不公平了。
kkk16 2001-08-13
  • 打赏
  • 举报
回复
给你一个最终解决方法:
直接传送窗体的句柄给你的DLL,然后用SendMessage(hwnd,...);
这样就可以了。

注意:
1.直接传窗体的this指针给它是行不通的,那样发消息会错。
2.即使在你的DLL中用传给你的窗体指针调用GetSafeHwnd()函数来发送消息也是行不通的。

lxw_6 2001-08-10
  • 打赏
  • 举报
回复
没有高手能回答我吗?
ydogg 2001-08-10
  • 打赏
  • 举报
回复
不可能把~~~应该不会用这种问题~~跟静态动态无关阿~~~
kittycai 2001-08-10
  • 打赏
  • 举报
回复
你是在哪里,哪时调用的?
seesi 2001-08-10
  • 打赏
  • 举报
回复
检查其他。跟转换没有什么联系吧。
xtra 2001-08-10
  • 打赏
  • 举报
回复
不转换怎么它怎么知道指的哪个呢?。如果你有好多个视图。如果不转换直接用CView肯定不行的。
我是这么认为。仅供参考
kkk16 2001-08-10
  • 打赏
  • 举报
回复
关注。我也感到奇怪。
zhang_qxian 2001-08-10
  • 打赏
  • 举报
回复
我也不知道,但你可以用AfxGetApp()->AfxGetMainWnd()试试。
lxw_6 2001-08-10
  • 打赏
  • 举报
回复
那为什么一定要转换呢?不转换应该也不算错误啊?
还有为什么两个设置得到的结果不一样呢?
xt_jat 2001-08-10
  • 打赏
  • 举报
回复
CMainFrame* p_wnd=(CMainFrame*)AfxGetMainWnd();
xtra 2001-08-10
  • 打赏
  • 举报
回复
在得到主框架窗口的时候估计要转换一下使其指向DLL。
lxw_6 2001-08-10
  • 打赏
  • 举报
回复
没人能回答这个问题吗?
lxw_6 2001-08-10
  • 打赏
  • 举报
回复
up
AriDo 2001-08-10
  • 打赏
  • 举报
回复
哎搞不懂。为什么要钻牛角呢?他MFC的函数AfxGetMainWnd不能用咱就不用他的自己传进去呗。其实他也是把当前CWinApp类的m_pMainWnd指针传出来吗。
因为你DLL也有个CWinApp类而且没有个他的m_pMainWnd赋值所以AfxGetMainWnd()就NULL了吧(呵呵!我估计。)
对了不知道用AfxGetApp()->m_pMainWnd是不是NULL,你试试。
不行就加上AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
不过还是做个函数传进去m_pMainWnd->m_hWnd;即方便又保险呀。
han012 2001-08-10
  • 打赏
  • 举报
回复
1)你的DLL是MFC Extension DLL,所以它必须Use MFC in a Shared Dll,否则编译出错.(基本上是废话)

2)你可以将你的DLL用"Regular DLL with MFC statically linked"重新改写(如果你没有导出MFC类的派生类).否则,你的要求 "有什么解决办法,使我用Static连接时也能得到正确的值呢"不能从根本上解决...(瞎猜的,也许有高人能解决)

3)如果你不想改写你的Extension DLL,则按WhiteWaterBlueSky(疯狂数码)说的
你必须在你的DLL函数(包含调用AfxGetMainWnd()的那个函数)第一行加入
AFX_MANAGE_STATE(AfxGetStaticModuleState( )); (一切责任本人概不负责)

4)因为涉及到线程跨不同MODULE的执行,这些MODULE对MFC库的调用又有static又有share,所以
不要相信你在DLL中调用AfxGetMainWnd()得到的返回值真的指向你的MainFrame, 也许它只是一个templete C++类, 所以,你应该使用这个返回值继续得到它对应的HWND,
HWND hwnd = (CWnd*)AfxGetMainWnd()->GetSafeHwnd()
HWND是你值得相信的,你可以用::SendMessage(hWnd,...)发消息. (信不信由你..)

5)至于AfxGetMainWnd()怎么得到的是NULL,我说不清楚. 估计涉及到MFC的深层实现,大概非高人不能解释. (说不清楚就不瞎说了 :) )

lxw_6 2001-08-10
  • 打赏
  • 举报
回复
好啊,谢谢了。
我的E-Mail是:
sh_bj@china.com
jiagh 2001-08-10
  • 打赏
  • 举报
回复
我记得我机子里有这个解决的方法的资料。
如果你要的话我可以明天发EMAIL给你
lxw_6 2001-08-10
  • 打赏
  • 举报
回复
???
lxw_6 2001-08-10
  • 打赏
  • 举报
回复
我的DLL是MFC Extension DLL,它没有窗口,只有应用程序一个主窗口。
我得到主窗口是想从DLL中象主窗口发一个消息。
请高手帮忙啊。
请高手帮忙啊。
请高手帮忙啊。
请高手帮忙啊。
难道CSDN没有高手?
加载更多回复(5)

16,551

社区成员

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

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

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