共享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中真的没问题 展开
函数如下,如果用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中真的没问题 展开
展开全部
不管在DLL还是EXE中你的方法都是有问题的,
CMyWnd *pWnd = new CMyWnd;
pWnd是一个局部变量,到函数结束时就不存在,在CWnd析构函数里它会调用DestroyWindow!
--------------------------
更正:应该是这会导致内存泄漏
应该是在DLL中父窗口不能这么用,按我回复的这个贴的方法试试看
http://zhidao.baidu.com/question/62488466.html
CMyWnd *pWnd = new CMyWnd;
pWnd是一个局部变量,到函数结束时就不存在,在CWnd析构函数里它会调用DestroyWindow!
--------------------------
更正:应该是这会导致内存泄漏
应该是在DLL中父窗口不能这么用,按我回复的这个贴的方法试试看
http://zhidao.baidu.com/question/62488466.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询