2017-03-02 19 views
-4

現在Qt CreatorでMingW32 G ++コンパイラを使用しています。Qt Creatorで標準のC++がコンパイルされない

私はそう、私はQtのネットワーク機能を使用することができますQtのにコードブロックからコードを作業の上に移植されましたが、コードの上にモーメントIポートは、それがのエラーでコンパイルに失敗します。

C:\software\Qt\AutoUpload\main.cpp:90: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'void* FindFirstFileW(LPCWSTR, LPWIN32_FIND_DATAW)' 
HANDLE handle = FindFirstFile(dir, &search_data); 

このエラーを与えるコードの一部がライン8:

1 vector<string> getFilesInDir(string directory) 
2 { 
3  vector<string> filenames; 
4  string dir = string(directory + "\\*"); 
5 
6  WIN32_FIND_DATA search_data; 
7  memset(&search_data, 0, sizeof(WIN32_FIND_DATA)); 
8  HANDLE handle = FindFirstFile(dir.c_str(), &search_data); 
9  while (handle != INVALID_HANDLE_VALUE) 
10 { 
11  if (FindNextFile(handle, &search_data) == FALSE) break; 
12  if (search_data.cFileName == string(".") || search_data.cFileName == string("..")) 
13  { 
14   cout << "Ignoring..." << endl; 
15   continue; 
16  } 
17  filenames.push_back(search_data.cFileName); 
18  cout << search_data.cFileName << endl; 
19 } 
20 
21 FindClose(handle); 
22 return filenames; 
23 } 

なもののような他の質問は、これはUnicodeエンコーディングのWindows APIでいくつかの問題であることをherehere状態を発見しましたLPCWSTRタイプで使用しますが、この回答は不完全または間違っています。 CodeBlocksとQt Creatorの両方での私のエンコーディング設定は、UTF-8であり、Unicodeやその他のエンコーディング方法ではありません。

Unicodeの問題の場合、ではなく、がVisual StudioまたはCodeBlocksでコンパイルされていますが、それは関係ありません。 ONLY環境は完全にはコンパイルされませんが、Qtにあります。

突然このコードが機能しなくなるQt Creatorとは何ですか?

+3

表示されるエラーメッセージとコードが一致しません。 –

+0

2番目の回答を参照してください。 http://stackoverflow.com/questions/8032080/how-to-convert-char-to-wchar-t – silentboy

+0

はい、そうです。私は手作業で行番号を追加したので、エラーが発生している行を簡単に指摘することができました。 (コード8による8行目、コード90行目の90行目) コメントする前に実際に質問を読むべきでしょうか。 – Kats

答えて

3

Windows APIで文字列を受け取るすべての関数は、実際にはマクロです。

this FindFirstFile referenceの下部には、FindFirstFileWFindFirstFileAという2つの機能があります。どちらが使用されるかはUNICODEマクロによって決まります。定義されていない場合はANSI関数(FindFirstFileA)が使用されます。そうでない場合はワイド文字バージョン(FindFirstFileW)が使用されます。

UNICODEが定義されている場合、ワイドキャラクターのバージョンを使用する必要があります。文字列クラスはstd::wstringです。

+0

私の解決策は文字通り '' #undef UNICODE'''をファイルの先頭に追加するだけです。これは、他のすべての質問が答えようとしていたどんなロータリーソリューションよりもはるかに有益な答えです。 – Kats

+0

@Katsそれは本当に残りのコードに依存します。そして、 'UNICODE'マクロはプロジェクト設定のフラグによって制御されます(私は本当にどこにいても正確にはわかりません)。 –

+0

'' #undef UNICODE'''を追加すると、コードは意図したとおりにコンパイルされ実行されます。他のすべてのIDEがそれを強制しない場合、Qt Creatorでこれはなぜ必要なステップですか? – Kats