2017-04-15 23 views
0

我在一個空白項目(visual studio)中使用了一些代碼,它使用Windows.h 我想將這個程序放入我的C++ windows窗體應用程序中。 所以我爲它做了一堂課。奇怪的是代碼給我一個錯誤Windows.h在Windows窗體中的行爲不同於C++

#include "ImageCompiler.h" 



ImageCompiler::ImageCompiler() 
{ 
} 

void ImageCompiler::find_images() 
{ 

} 

std::vector<string> ImageCompiler::get_all_files_names_within_folder(string folder) 
{ 
    std::vector<std::string> names; 
    std::string search_path = folder + "/*.*"; 
    WIN32_FIND_DATA fd; 
    HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd); 
    if (hFind != INVALID_HANDLE_VALUE) { 
     do { 
      if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { 
       names.push_back(fd.cFileName); 
      } 
     } while (::FindNextFile(hFind, &fd)); 
     ::FindClose(hFind); 
    } 
    return names; 
} 

它說,SEARCH_PATH(爲const char *)不匹配參數(LPCWSTR) 沒有什麼特別在頭文件(只#包括WINDOWS.H) 和其他一些課堂事物。

如果我創建一個空的程序只有windows.h和這個代碼它將工作。 ,但不在Windows窗體應用程序中,即使它在另一個文件中,也不在 之間。我不明白這一點。 我其實很愚蠢和糟糕的編程,所以它可能是一個愚蠢的 錯誤。我希望有一個人可以幫助我。我可以給你從 Myform.h的代碼,但我不認爲這會有所幫助。

+0

UNICODE總是在C++/CLI #define的應用程序。使用std :: wstring或FindFirstFileA()或System :: IO :: Directory :: GetFiles() –

+0

如果您使用的是.Net,您應該避免直接在任何情況下使用Win API。 – Clifford

+0

.Net?贏得API我不知道這兩個。 – JamesT

回答

0

在windows.h中,類型字符串和字符串指針類型別名是根據您是否使用Unicode支持構建的。在這種情況下,LPCWSTR中的W(寬)代表Unicode編譯,因此char*接口不兼容。

如果您不需要它,最簡單的解決方案是關閉構建的Unicode /寬字符字符串支持。但是我不確定,如果C++/CLI可以使用,在這種情況下,必要時使用'wchar`接口。

一個空的項目,包括windows.h編譯只是因爲你不會有使用任何接口。如果沒有代碼,則不會嘗試分配不兼容的類型,因此不會出現錯誤。

+0

它工作。謝謝! – JamesT

0

首先,如果您使用的是託管C++(C++/CLI),請儘可能多地使用它。 Listing all files with Managed C++可能比非託管C++更容易。

託管C++使用UNICODE。什麼是unicode?不久之後,您可以使用英文以外的其他字母。在你的代碼中,你不使用unicode。這意味着,如果你發現找到一個文件,比如用俄文字母命名,你就不會得到它的實際名稱。

在windows.h中有函數和變量unicode和非unicode。在大多數情況下,Unicode版本功能與名稱末尾的字母W在名稱上有所不同。您可以隨時通過使用「函數或變量名稱 unicode」找到它。因此,您可以通過將W添加到函數中來使用它們,例如FindFirstFileW而不是FileFirstFileA。您的編譯器通過訪問FindFirstFile指向哪個編譯器,但是您可以改變它(使編譯器自動尋找unicode函數),這取決於編譯您正在使用的代碼的程序。去谷歌上查詢。

要回答你的問題...你這是怎麼編輯代碼: 所有string s到wstring小號

WIN32_FIND_DATA到WIN32_FIND_DATAW

"/*.*"L"/*.*"

Find...功能Find...W