void SettingsManagerHelpers::GetAsciiFilename(const wchar_t* wfilename, CCharBuffer buffer) { if (buffer.getSizeInElements() <= 0) { return; } if (wfilename[0] == 0) { buffer[0] = 0; return; } if (Utf16ContainsAsciiOnly(wfilename)) { ConvertUtf16ToUtf8(wfilename, buffer); return; } // The path is non-ASCII unicode, so let's resort to short filenames (they are always ASCII-only, I hope) wchar_t shortW[MAX_PATH]; const int bufferCharCount = sizeof(shortW) / sizeof(shortW[0]); const int charCount = GetShortPathNameW(wfilename, shortW, bufferCharCount); if (charCount <= 0 || charCount >= bufferCharCount) { buffer[0] = 0; return; } shortW[charCount] = 0; if (!Utf16ContainsAsciiOnly(shortW)) { buffer[0] = 0; return; } ConvertUtf16ToUtf8(shortW, buffer); }
//------------------------------------------------------------------------- ResetPermissionDialog::ResetPermissionDialog() : m_pArgs(nullptr), m_nbArgs(0) { int nArgs; LPWSTR *szArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs); if (szArgList != nullptr) { m_nbArgs = nArgs; m_pArgs = new LPCTSTR[nArgs]; for (auto i = 0; i < nArgs; ++i) { #ifdef _UNICODE m_pArgs[i] = _wcsdup(szArgList[i]); #else std::string utf8; if (!ConvertUtf16ToUtf8(szArgList[i], nullptr, &utf8)) utf8 = ""; m_pArgs[i] = _strdup(utf8.c_str()); #endif } // Free argument list LocalFree(szArgList); } }
//------------------------------------------------------------------------- bool ResetPermissionDialog::ExecuteCommand(stringT &Cmd) { std::string Utf8Cmd; #ifdef _UNICODE std::string utf8_str; bool bEncodingRequired; if (!ConvertUtf16ToUtf8(Cmd.c_str(), &bEncodingRequired, &utf8_str)) { MessageBox( hDlg, _TEXT("Failed to convert input command to UTF-8"), TEXT("Error"), MB_OK | MB_ICONERROR); return false; } if (bEncodingRequired) { // 65001 = utf-8 # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx Utf8Cmd = "CHCP 65001\r\n\r\n" + utf8_str; } else { Utf8Cmd = utf8_str; } #else Utf8Cmd = Cmd; #endif // Overwrite/create the previous temp Batch file LPCTSTR CmdFileName = GenerateWorkBatchFileName(); // Write the temp Batch file (as binary) FILE *fp; if (_tfopen_s(&fp, CmdFileName, _TEXT("wb")) != 0) { stringT err_msg = TEXT("Failed to write batch file to: "); err_msg += CmdFileName; MessageBox( hDlg, err_msg.c_str(), TEXT("Error"), MB_OK | MB_ICONERROR); return false; } fwrite(&Utf8Cmd[0], 1, Utf8Cmd.size(), fp); fclose(fp); // Execute the temp batch file return SUCCEEDED( ShellExecute( hDlg, _TEXT("open"), CmdFileName, NULL, NULL, SW_SHOW)); }