簡體   English   中英

錯誤 C2664 '<function-style-cast> ': 無法從 'CHAR [260]' 轉換為 'std::wstring'</function-style-cast>

[英]Error C2664 '<function-style-cast>': cannot convert from 'CHAR [260]' to 'std::wstring'

我正在創建一個 c++ 項目,我在構建時不斷收到此錯誤。

錯誤 C2664 '':無法從 'CHAR [260]' 轉換為 'std::wstring'

這是我的 function 打電話

uint32_t exe_pid = util::find_process("ProgramName.exe");;

這是 function

uint32_t find_process(const std::string& Name) {
    PROCESSENTRY32 ProcessEntry;
    ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE ProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(ProcessSnapshot, &ProcessEntry)) {
        do {
            if (!_stricmp(ws2s(std::wstring(ProcessEntry.szExeFile)).c_str(), Name.data())) {
                CloseHandle(ProcessSnapshot);
                return ProcessEntry.th32ProcessID;
            }
        } while (Process32Next(ProcessSnapshot, &ProcessEntry));
    }
    CloseHandle(ProcessSnapshot);
    return 0;
}

這是問題所在

 std::wstring(ProcessEntry.szExeFile)

任何幫助,將不勝感激 !

您正在使用 Win32 API 函數的TCHAR版本,並且您顯然是在關閉 UNICODE 的情況下編譯項目,因此:

  • TCHAR映射到char
  • 基於 TCHAR 的Process32First() function 映射到 ANSI Process32FirstA() function。
  • 基於 TCHAR 的Process32Next() function 映射到 ANSI Process32NextA() function。
  • 基於 TCHAR 的PROCESSENTRY32結構映射到 ANSI PROCESSENTRY32A結構,因此它的szExeFile字段是一個char[]數組。

ws2s()std::wstring作為輸入並返回std::string 但是std::wstring沒有接受char[]作為輸入的構造函數。 這就是您在std::wstring(ProcessEntry.szExeFile)上收到編譯器錯誤的原因。

由於_stricmp()const char*指針作為輸入,並且您的輸入Name參數是std::string 1 ,並且您使用的是 API 的 ANSI 版本,因此您根本不應該調用ws2s()

1:因此,您應該直接使用 API 的 ANSI 版本,而不是 TCHAR 版本。

試試這個:

uint32_t find_process(const std::string& Name) {
    PROCESSENTRY32A ProcessEntry;
    ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE ProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (ProcessSnapshot) {
        if (Process32FirstA(ProcessSnapshot, &ProcessEntry)) {
            do {
                if (_stricmp(ProcessEntry.szExeFile, Name.c_str()) == 0) {
                    CloseHandle(ProcessSnapshot);
                    return ProcessEntry.th32ProcessID;
                }
            } while (Process32NextA(ProcessSnapshot, &ProcessEntry));
        }
        CloseHandle(ProcessSnapshot);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM