我是靠谱客的博主 专注刺猬,这篇文章主要介绍调用DLL开启线程的问题,现在分享给大家,希望可以做个参考。

 错误的编写方式:(注意用感叹号夹起来的两行)在 ::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开启线程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部