使用rundll32 Windows时QProcess立即完成而无输出

时间:2019-07-03 02:38:49

标签: python dll pyqt qprocess rundll32

我正在尝试使用QProcess为《指环王》在线启动补丁dll并获取输出,但是它仅在Linux上有效(我通过QProcess通过wine来实现)。

我尝试了很多但没有成功,并且得出的结论是问题可能是rundll32将修补程序作为QProcess无法跟踪的独立进程来启动的。但这并没有真正成立,因为至少在我的测试中(其他人说它有时奏效了)补丁并未发生。

from qtpy import QtCore, QtWidgets
import sys

class PatchWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(720, 400)

        self.txtLog = QtWidgets.QTextBrowser(self)
        self.txtLog.setGeometry(5,5,710,351)

        self.process = QtCore.QProcess()
        self.process.readyReadStandardOutput.connect(self.readOutput)
        self.process.readyReadStandardError.connect(self.readErrors)
        self.process.finished.connect(self.processFinished)

        self.process.setWorkingDirectory("C:/LOTRO/")

        self.show()

        self.startProcess()

    def readOutput(self):
        line = self.process.readAllStandardOutput()
        line = str(line, encoding="utf8", errors="replace")
        self.txtLog.append(line)

    def readErrors(self):
        line = self.process.readAllStandardError()
        line = str(line, encoding="utf8", errors="replace")
        self.txtLog.append(line)

    def processFinished(self, exitCode, exitStatus):
        self.txtLog.append("Process Finished")

    def startProcess(self):
        self.process.start("rundll32 patchclient.dll,Patch patch.lotro.com:6015 --language DE --productcode LOTRO --highres")
        self.txtLog.append("Process Started")

app = QtWidgets.QApplication(sys.argv)
PatchWindow = PatchWindow()

sys.exit(app.exec_())

应该有类似于

的输出
Connecting to patch.lotro.com:6015

Checking files...
files to patch: 0 bytes to download: 0
Patching files:

File patching complete

,但是什么也没有。实际的代码是here

1 个答案:

答案 0 :(得分:0)

问题是rundll32在Windows上没有为dll提供任何输出。我正在通过WINE进行测试,它确实提供了输出。 PyInstaller单独报告了有关修补程序正常工作的夫妇报告和有关无效修补程序的更多报告。没有在实际Windows上进行测试的安装程序,这比原本应该的困难得多。