示例程序:获取图片读取路径多线程
int _tmain(int argc, _TCHAR* argv[]) { //初始化MFC或者设置资源句柄(不然下面使用MFC库会断言出错) //AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); //(1) AfxSetResourceHandle(GetModuleHandle(NULL)); //(2) //打开图片 CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR); dlg.m_ofn.lpstrTitle = _T("选择须要投影的图像"); dlg.m_ofn.lpstrFilter = _T("BMP\0*.bmp\0All Files\0*.*\0\0"); TCHAR filename[10000] = { 0 }; dlg.m_ofn.lpstrFile = filename; dlg.m_ofn.nMaxFile = 10000; if (dlg.DoModal() != IDOK) { AfxMessageBox(_T("打开图像失败!")); return 1; } //获取文件路径 vector<CStringA> imagePath; POSITION pos = dlg.GetStartPosition(); while (pos) { #ifdef UNICODE USES_CONVERSION; //文件选择顺序A,B,C,D;文件获取顺序D,A,B,C imagePath.push_back(T2A(dlg.GetNextPathName(pos))); #else imagePath.push_back(dlg.GetNextPathName(pos)); #endif } }
注意事项:
(1) 头文件:"afxdlgs.h";
(2) CfileDialog是MFC中的,须要资源模块句柄,不然会运行报错:ASSERT(afxCurrentResourceHandle != NULL)
解决方法:
(a)法一:使用CFiledialog前进行MFC资源初始化,如语句(1);
(b)法二:使用语句(2)设置程序目前要使用的资源模块句柄;
(3) 程序的运行库(属性->配置属性->常规->MFC使用)以及MFC使用(属性->配置属性->C/C++->代码生成->运行库)必须对应。"多线程DLL(MD)"(调试则为"多线程调试DLL(MDd)")对应"在共享DLL中使用MFC","多线程(MT)"(调试则为"多线程调试(MTd)")对应"在静态库中使用MFC"。
不然会报错:fatal error C1189;
(4)注意(3)中运行库中的设置与Debug版本和Release版本相关,若是设置错可能会致使程序出问题。如我在Release版本设置为"多线程调试DLL(MDd)"时,致使我调用的opencv中人脸识别代码执行结果出问题。网站
补充:若是字符集设置为"使用多字节字符集"时,编译报错:error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.
缘由:没有MBCS字符集,须要下载安装MBCS字符集。
VS2013版本MBCS字符集下载地址,其余版本能够再网站上搜索。ui