2014-11-20 42 views
4

我下的定義爲CFileDialog,但VS2013仍然告訴我,有沒有可用於該我傳入參數的構造函數與CFileDialog的實例化問題

我的代碼:

CFile theFile; 
char strFilter[] = { "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" }; 
CFileDialog fDlg = CFileDialog(TRUE, ".txt", NULL, 0, strFilter); 

導致的錯誤:

1 IntelliSense: no instance of constructor "CFileDialog::CFileDialog" matches the argument list argument types are: (int, const char [5], int, int, char [46]) c:\Users\Jonathan\Documents\Visual Studio 2013\Projects\SDI\SDI\MainFrm.cpp 131 21 SDI

而且CFileDialog構造以供參考:

explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs 
    LPCTSTR lpszDefExt = NULL, 
    LPCTSTR lpszFileName = NULL, 
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    LPCTSTR lpszFilter = NULL, 
    CWnd* pParentWnd = NULL, 
    DWORD dwSize = 0, 
    BOOL bVistaStyle = TRUE); 

什麼問題?

+2

這是一個UNICODE構建或MBCS? – PaulMcKenzie 2014-11-20 21:07:05

+0

@PaulMcKenzie我不知道如何回答這個問題。這是一個空白的MFC程序,這是我輸入到文件 - >打開事件處理程序的第一位代碼 – JayB 2014-11-20 21:08:43

+0

@ user134788用'L'前綴字符串文字,然後重試。您必須將'strFilter'的類型更改爲'WCHAR'。如果你已經結婚了使用T宏的想法,用'_T()'和'TCHAR'來包圍你的文字'strFilter []' – WhozCraig 2014-11-20 21:09:44

回答

4

問題似乎是您使用的字符串類型不正確。

快速解決方案是使用TCHAR而不是char。更好的解決方案是使用寬字符串並確保構建是Unicode。

當您在Visual Studio中創建項目時,使用的默認字符集類型是Unicode,而不是MBCS而不是「未設置」。這意味着帶有字符數組和指針的Windows API和MFC函數將使用寬字符。因此在Windows API函數上使用char,char *,const char*,期望寬字符串的Windows API函數將不會編譯。

的跡象表明,你的代碼是錯誤的,即使你知道Unicode或MBCS什麼,是你打電話拿類型的LPCTSTR的功能 - 這是一個const char *,這是它是什麼,即一個指向TCHAR的常量指針。如果你不知道如何使用指定的類型,那本來是很好的選擇。

所以我們得到的教訓是,如果一個函數想要一個類型,提供一個該類型的變量或表達式,而不是您認爲該類型等同於的類型。

1

好的。所以我已將我的代碼更改爲以下內容:

CFile theFile; 
TCHAR strFilter[] = { _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||") }; 
CFileDialog fDlg = CFileDialog(TRUE, _T(".txt"), NULL, 0, strFilter); 

而且,現在沒有問題。謝謝您的反饋!

+1

'TCHAR的另一件事是你不應該使用' L「...」'爲字符串甚至是「...」'你應該使用'_T(「...」)'。這是因爲TCHAR可以是'char'或'WCHAR'。 – rafeek 2014-11-20 21:39:33