共享MFC DLL的规则DLL中创建窗口出现问题,无法使用CWnd的派生类

另外新建一个对话框程序,添加一按钮来调用这个dll函数如下,如果用CWnd,可以在对话框中成功创建窗口extern"C"_declspec(dllexport)voidd... 另外新建一个对话框程序,添加一按钮来调用这个dll

函数如下,如果用CWnd,可以在对话框中成功创建窗口

extern "C" _declspec (dllexport) void dllWin(CWnd* pParentWnd)
{
CWnd *pWnd = new CWnd;
pWnd->Create(NULL, NULL, WS_VISIBLE ¦WS_CHILD, CRect(50,50,200,200), pParentWnd, 0);

pWnd->ShowWindow(SW_SHOWNORMAL);
pWnd->UpdateWindow();
}

如果用派生于CWnd的CMyWnd,则出错,可以创建出窗口,但是鼠标在上面点一下就出错,关闭程序

CMyWnd派生完以后没有做任何改动

extern "C" _declspec (dllexport) void dllWin(CWnd* pParentWnd)
{
CMyWnd *pWnd = new CMyWnd;
pWnd->Create(NULL, NULL, WS_VISIBLE ¦WS_CHILD, CRect(50,50,200,200), pParentWnd, 0);

pWnd->ShowWindow(SW_SHOWNORMAL);
pWnd->UpdateWindow();
}

调用DLL如下

typedef void ( *lpFun)(CWnd*);

HINSTANCE hDll;//DLL句柄
hDll = LoadLibrary ("..\\Debug\\dllWin.dll");

if(hDll==NULL)
{
AfxMessageBox("Load Dll Fail");
}
else
{
lpFun pDllWin;
pDllWin = (lpFun)GetProcAddress (hDll,"dllWin");

if(pDllWin==NULL)
{
AfxMessageBox("Load Dll Fun Fail");
}
else
{

HINSTANCE exe_hInstance = GetModuleHandle(NULL);

HINSTANCE dll_hInstance = GetModuleHandle("dllWin.dll");

AfxSetResourceHandle(dll_hInstance); //切换状态

(*pDllWin)(this);

AfxSetResourceHandle(exe_hInstance); //恢复状态

}

FreeLibrary(hDll);
}

如果不用DLL,而是直接在对话框中添加另外一个按钮,

代码如下:

void CDllWinCallDlg::OnCallWin()
{
CMyWnd *pWnd = new CMyWnd;

pWnd->Create(NULL,NULL, WS_VISIBLE ¦WS_CHILD, CRect(50,250,200,400), this, 0);

pWnd->ShowWindow(SW_SHOWNORMAL);
pWnd->UpdateWindow();

}

在其中直接创建窗口,这时候不管是CWnd还是CMyWnd都是可以成功创建的。
为什么没人帮我啊,我已经把分数都加上了,我就只剩下12分了

EXE中真的没问题
展开
 我来答
lcability
2008-08-11 · TA获得超过425个赞
知道小有建树答主
回答量:1048
采纳率:0%
帮助的人:417万
展开全部
不管在DLL还是EXE中你的方法都是有问题的,
CMyWnd *pWnd = new CMyWnd;
pWnd是一个局部变量,到函数结束时就不存在,在CWnd析构函数里它会调用DestroyWindow!

--------------------------
更正:应该是这会导致内存泄漏

应该是在DLL中父窗口不能这么用,按我回复的这个贴的方法试试看

http://zhidao.baidu.com/question/62488466.html
abc3y
2008-08-11 · TA获得超过260个赞
知道答主
回答量:190
采纳率:0%
帮助的人:0
展开全部
CMyWnd *pWnd = new CMyWnd;
初始化问题,我觉得是。我之前用CInternetSession也出现过这个问题,后来发现是初始化参数不对导致的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式