Dll问题

Jagen在路上 2004-05-04 12:23:31
如何在DLL中创建子窗口,并且可以并入主窗口中!
...全文
43 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqingyuan 2004-05-05
  • 打赏
  • 举报
回复
那说说你是怎么解决的啊,也好让大家学习学习!
Jagen在路上 2004-05-05
  • 打赏
  • 举报
回复
最后给大家解答:
如果只是传递CWnd指针给导出窗口的话,在建立模式窗口时没有问题,但是这个不是我所希望的,我们在后的做法是,把主窗口的句柄传递给DLL,然后在dll中根据主窗口句柄创建一个临时的窗口实例,然后将这个指针传递给Create函数,这样就可以创建成功!分析原因是EXE与DLL不再一个进程空间内,DLL无法获得主窗口实例,在创建非模式窗口时,无法进入EXE的消息循环,导致窗口创建失败,通过上述方法,让DLL获得主窗口的拷贝实例,就可以进入EXE的消息循环,窗口创建成功!
Jagen在路上 2004-05-05
  • 打赏
  • 举报
回复
_foo(void)是我的朋友,我们在一起工作,我们一起解决了这个问题,我把分给他了,希望大家能理解!
Jagen在路上 2004-05-05
  • 打赏
  • 举报
回复
问题已经解决,但是你们给出的方法都不合适,谢谢!
ringphone 2004-05-05
  • 打赏
  • 举报
回复
SDK方式:用CreateWindow就行了,DLL中导出创建窗口的函数比如CreatePanel(HWND hParentWnd),传入主窗口的HWND,DLL中CreateWindow主窗口的子窗口。
Jagen在路上 2004-05-04
  • 打赏
  • 举报
回复
调用DoModal不用那么麻烦,我想的是这个子窗口成为主窗口的Panel,不能用模式的!
feeboby 2004-05-04
  • 打赏
  • 举报
回复
sdk方法:在dll中使用DialogBoxParam
mfc方法:
class CDllDlg : public CDialog
{
public:
CDllDlg(UINT nIDTemplate,CWnd* pParentWnd);
public:
BOOL Create( UINT nIDTemplate,CWnd* pParentWnd = NULL );
virtual int DoModal( );
DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CDllDlg, CDialog)
//{{AFX_MSG_MAP(CClrQuantDlg)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CDllDlg::CDllDlg(UINT nIDTemplate,CWnd* pParentWnd)
:CDialog(nIDTemplate,pParentWnd)
{

}

BOOL CDllDlg::Create( UINT nIDTemplate,CWnd* pParentWnd)
{
BOOL ret;
HMODULE h=AfxGetResourceHandle();
AfxSetResourceHandle(g_hmodule);
ret=CDialog::Create(nIDTemplate,pParentWnd);
AfxSetResourceHandle(h);
return ret;
}

int CDllDlg::DoModal()
{
BOOL ret;
HMODULE h=AfxGetResourceHandle();
AfxSetResourceHandle(g_hmodule);
ret=CDialog::DoModal();
AfxSetResourceHandle(h);
return ret;
}
你的窗口类从CDllDlg继承就行,
然后调用DoModal
_foo 2004-05-04
  • 打赏
  • 举报
回复
up

15,471

社区成员

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

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