多进程传参问题

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无法触发!

跪求大侠,出手相助,如何破解?
...全文
327 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
  • 打赏
  • 举报
回复
把要执行的内容写到临时的批处理文件中,然后执行这个临时的批处理。
内容概要:本文详细介绍了Linux线程的概念、创建与传参的方法及其应用场景。首先解释了线程与进程的区别,强调线程在提升程序性能方面的作用,尤其是在多核处理器环境中。接着重点解析了`pthread_create`函数,包括其函数原型、参数详解(线程标识符指针、线程属性指针、线程运行函数指针、运行函数参数)及返回值含义。随后探讨了三种主要的线程传参方式:值传递、地址传递和全局变量传递,分析了各自的优缺点和注意事项。最后通过一个多线程拷贝文件的实战案例,展示了如何将理论应用于实际编程中,解决了文件指针偏移错误、线程同步问题,并进行了性能优化。 适合人群:具有一定编程基础,尤其是对Linux系统有一定了解的研发人员,特别是那些希望深入理解多线程编程原理和技术细节的人士。 使用场景及目标:①理解线程与进程的区别,掌握线程在提升程序性能方面的作用;②熟练掌握`pthread_create`函数的使用方法,包括创建线程和设置线程属性;③学会多种线程传参方式及其适用场景,如值传递、地址传递和全局变量传递;④通过实战案例,掌握多线程编程的具体实现方法,解决实际问题,如文件拷贝效率低下的问题。 阅读建议:本文内容详实,涵盖了从理论到实践的各个方面。建议读者在阅读过程中,结合实际编程练习,逐步理解和掌握每个知识点。特别是在学习线程传参和实战案例部分时,应多进行代码调试和优化,以加深理解。同时,关注线程同步问题的解决方案,这对于编写健壮的多线程程序至关重要。

21,434

社区成员

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

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