错误的编写方式:(注意用感叹号夹起来的两行)在 ::FreeLibrary(hPro);这一行代码执行之后,dll里面的分配的内存空间就会全部被释放掉,所以会报“帧不在模块之中”,“内存访问错误”之类的错误。
void CMFCApplication2Dlg::OnBnClickedOk()
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
HINSTANCE hPro = ::LoadLibrary("MFCLibrary1.dll");//加载一个自己写的DLL,提供了一
//getCFindFile用于获取一个类指
//针;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (hPro == NULL)
{
return ;
}
else
{
typedef MyCFindFile* (*MENU_EXECUTE)();
MENU_EXECUTE getCFindFile = NULL;
getCFindFile = (MENU_EXECUTE)::GetProcAddress(hPro, "getCFindFile");//MenuExecute 函数名字
if (getCFindFile)
{
MyCFindFile * pItem = getCFindFile();
CString s;
GetDlgItemText(IDC_EDIT4,s);
s.Format(_T("%s"), s);
std::string strStr;
strStr = s.GetBuffer(0);
HWND hdlg = GetSafeHwnd();
pItem->funcFindFile(strStr, hdlg, 2);
//pItem->m_hMainDlg = GetSafeHwnd();//把当前主对话框的窗口句柄传过去,这样就可以在线程函数中使用
//m_ResultList.DeleteAllItems();//清空上一次执行完之后的信息
//std::string strStr;
//strStr = pItem->m_PathFind.GetBuffer(0);
//funcFindFile(strStr, pItem->m_hMainDlg);
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
::FreeLibrary(hPro);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
return;
}
正确的写法:
1,将HINSTANCE hPro;添加到类成员变量之中
2,将FreeLibrary(hPro);函数放到MFC退出按钮里面,反正要保证在使用完hpro之前不要释放掉,也可以直接用静态加载
最后
以上就是专注刺猬最近收集整理的关于调用DLL开启线程的问题的全部内容,更多相关调用DLL开启线程内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复