win32控制檯程序使用CfileDialog進行文件讀取

win32控制檯程序使用CfileDialog進行文件讀取

示例程序:獲取圖片讀取路徑多線程

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

相關文章
相關標籤/搜索