多进程传参问题

sunjiankirk 2014-02-25 08:14:40
现需要在主进程中,调用msiexec.exe,来安装msi文件。
经过测试,发现主要有两个问题:
1、等号和空格会导致参数解析错误

QStringList params;
QString msi_dir = "C:/my.msi";
params <<"/i" << QDir::toNativeSeparators(msi_dir); // <<"/qb"
params << QString::fromUtf8("INSTALLDIR=e:\\Program Files\\我的文件");

QProcess *installPro = new QProcess();
installPro->startDetached("msiexec.exe", params);

经测试,这种方法支持中文,但是对于INSTALLDIR=的定义,会无法正确解析,网上查资料后,
也改过把\\化成/,或者对"INSTALLDIR=\"e:\\Program Files\\我的文件\""都没有作用。
2、中文解析错误

QStringList params;
QString msi_dir = "C:/my.msi";
params << "msiexec.exe" << "/i" << QDir::toNativeSeparators(msi_dir); // <<"/qb"
QString str = QString("INSTALLDIR=\"%1\"").arg("e:/Program Files/我的文件");
params << QDir::toNativeSeparators(str);

QString arg = params.join(" ");

QFile file("test.bat");
file.open(QIODevice::WriteOnly | QIODevice::Text);
file.reset();
file.write(arg.toLatin1());
file.close();

QProcess *installPro = new QProcess();
installPro->startDetached("test.bat");

这种方法倒是能解决上一种方法的问题,但是INSTALLDIR如果包含中文,会出现乱码。
也试过

QTextStream streamFileOut(&file);
streamFileOut.setCodec(QTextCodec::codecForName("UTF-8"));
streamFileOut.setGenerateByteOrderMark(true);

但是只能写入中文到bat文件,但是会导致msiexec无法触发!

跪求大侠,出手相助,如何破解?
...全文
324 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunjiankirk 2014-02-25
  • 打赏
  • 举报
回复
发现了,确实是系统编码的问题! 还是使用第二种方法

    QStringList params;
    QString msi_dir = "C:/my.msi";
    params << "msiexec.exe" << "/i" << QDir::toNativeSeparators(msi_dir); // <<"/qb"

    QString str = QString::fromUtf8("INSTALLDIR=\"e:\\Program Files\\我的文件\"");
    params << QDir::toNativeSeparators(str);

    QString arg = params.join(" ");


    QFile file("test.bat");
    file.open(QIODevice::WriteOnly | QIODevice::Text);

    file.reset();
    QTextStream streamFileOut(&file);
    streamFileOut.setCodec(QTextCodec::codecForName("gbk"));
    streamFileOut.setGenerateByteOrderMark(false);

    streamFileOut << arg;
    streamFileOut.flush();

    file.close();

    QProcess *installPro = new  QProcess();
    installPro->startDetached("test.bat");
关键就是15、16行,开始我的测试环境是英文版XP,把bat拷到中文XP下,虽然通过记事本看到是乱码,但是运行起来目标路径是正确的中文。 中文害人啊!!
sunjiankirk 2014-02-25
  • 打赏
  • 举报
回复
这个我试了,但是有中文编码的问题
zyq5945 2014-02-25
  • 打赏
  • 举报
回复
把要执行的内容写到临时的批处理文件中,然后执行这个临时的批处理。

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧