В VBA я использую написанное мной внешнее программное обеспечение. Я знаю, что программа работает хорошо. Я могу запустить его из командной строки. Но когда я пытаюсь выполнить его с помощью WScript.Shell.Run, он возвращает 1 и никогда не запускается. Я даже не могу сказать, что он вообще запускает программное обеспечение.
Вот исполняющая часть класса VBA.
Public Function Execute() As Integer
Dim wsh As Object
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim exitCode As Integer: exitCode = -1
Set wsh = VBA.CreateObject("WScript.Shell")
'Run program with arguments and wait for the program to finish
If Me.PrinterType = 1 Then exitCode = wsh.Run(Me.Path & " /serial = " & Me.SerialNumber & " /position = " & Me.Location & "", windowStyle, waitOnReturn)
If Me.PrinterType = 2 Then exitCode = wsh.Run(Me.Path & " /boxid = " & Me.Location & " /version = " & Me.Version, windowStyle, waitOnReturn)
Execute = exitCode
End Function
Пример полной строки выполнения:
C:.path.to.\PrintLabel.exe /serial=EOSJ61110044 /position=2
Доказательства того, что сценарий выполняется без ошибок на том же компьютере, на котором выполняется VBA:

Так что я понятия не имею, что происходит.
Я могу успешно использовать следующий Функция оболочки VBA:
If Me.PrinterType = 1 Then exitCode = Shell(Me.Path & " /serial = " & Me.SerialNumber & " /position = " & Me.Location, vbHide)
Но тогда проблема заключается в том, что VBA не дожидается завершения работы программного обеспечения, прежде чем продолжить. Так что мне нужно продолжать попытки заставить WScript.Shell работать. Что мне не хватает? Есть ли какие-то конкретные ссылки, которые нужно включить, но которых мне может не хватать?
Обновление 1:
Пытался имитировать этот пост SO, но все равно безуспешно:
If Me.PrinterType = 1 Then fullExecutionString = Me.Path & " /serial = " & Me.SerialNumber & " /position = " & Me.Location
If Me.PrinterType = 2 Then fullExecutionString = Me.Path & " /boxid = " & Me.Location & " /version = " & Me.Version
wsh.Run fullExecutionString, windowStyle, waitOnReturn
Обновление 2: Сделал небольшой метод, который повторяет процесс в windows cmd console. Он работает (более или менее) с тем же кодом. Я предполагаю, что это как-то связано со строкой пути к команде с аргументами?
Private Sub Button2_Released()
Dim wsh As Object
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim exitCode As Integer: exitCode = 0
Set wsh = VBA.CreateObject("WScript.Shell")
exitCode = wsh.Run("C:\Windows\System32\cmd.exe", windowStyle, waitOnReturn)
End Sub





Отвечая на свой вопрос:
После долгой отладки я решил, что путь с пробелами вызывает проблему. Если я напрямую ввожу следующее (обратите внимание на размещение цитаты), код успешно запустится:
exitCode = wsh.Run("""C:\path.to\PrintLabel.exe"" /serial=EOSJ61110044 /position=2", windowStyle, waitOnReturn)
Итак, в конце концов я скорректировал свое свойство Path:
Public Property Let Path(ByVal NewValue As String)
actPath = Chr(34) & NewValue & Chr(34)
End Property
Public Property Get Path() As String
Path = actPath
End Property