Обновлен Qt5.4.1 до 5.12.1, и теперь QCodec дает исключение - PullRequest
1 голос
/ 10 октября 2019

Я «унаследовал» проект, который работал нормально, но мы обновили его для работы с visual studio 2015 и версией 5.12.1.

Но по какой-то причине он теперь дает исключение. Что он в основном делает, так это проверяет местоположение в regedit (которое написано из другого приложения) и читает строковое значение (которое записывает пользователей). Это следующий запрос:

CMD:

wmic /node:127.0.0.1 /user: "User" /password:"Password" class stdregprov call GetStringValue hDefKey="&H80000007" sSubKeyName=Software\Company\ApplicationServer sValueName=USERS"

Когда я запускаю его из cmd, он возвращает результат и дает тот же результат в приложении.

Возвращаемое значение: OUT:

Executing (stdregprov)->GetStringValue()

Method execution successful.

Out Parameters:
instance of __PARAMETERS
{
  ReturnValue = 0;
  sValue = "";
}

Но когда он пытается кодек в приведенном ниже коде, он дает исключение нарушения прав доступа. Обратите внимание, что cmd - это параметры, которые мы отправили в cmd (как показано выше), а out - ответ (как показано выше).

void MyUtil::runProcess(QString& cmd, QString& out, QString& arr){

QProcess process;
process.start(cmd);
proces.waitForFinished(osProcessTimeout*1000);

if(cmd.contains("sValueName=USERS")){ //which is true for our problem
QByteArray arr = process.readAllStandardOutput();
QTextCodec *codec = QTextCodec::codecForName("857");
out = codec->toUnicode(arr);   // ----> WHERE IT GIVES THE EXCEPTION

}else{

out = process.readAllStandardOutput();

}

err = process.readAllStandardError();

}

1 Ответ

3 голосов
/ 10 октября 2019

codec, скорее всего, nullptr, поскольку он не может найти кодек с именем 857https://doc.qt.io/qt-5/qtextcodec.html Ваше имя кодека 857, по-видимому, недействительно;если это не заказной, который вы сделали. Вы, вероятно, должны использовать codecForLocale, если только вам не нужен определенный кодек, в этом случае вам понадобится правильное имя "Qt"

...