vba — Управление потоком программ между VB и переполнением стека

У меня есть программа, которая запускается из VB / Excel и выполняет программу C ++ в середине этого. У меня есть два (я думаю, связанных) вопроса:

  1. Я фиксирую возвращаемое значение из программы на C ++, когда она выполняется, но полученное число не равно нулю (вместо этого это целое число из 4 цифр, примеры значений, которые я получил, составляют 8156, 5844, 6100, 5528). Я уверен, что программа нормально завершает работу с кодом 0, но я думаю, что VB получает свое значение до того, как программа C ++ завершит свое выполнение — это объяснит, почему я не получаю нулевое значение, и как я могу получить окончательный, правильный вернуть значение из моей программы C ++?

  2. [Вероятно, в качестве решения # 1] Как я могу заставить программу VB приостановить работу, пока модель C ++ не завершит свое выполнение? Мне нужно выполнить дополнительную работу с VB (конфигурация вывода на основе запуска модели C ++) после завершения модели

Вот мой код VB для вызова модели. Я запускаю полностью скомпилированную программу C ++ через оболочку Windows.

'---------------------------------------------------------
' SECTION III - RUN THE MODEL AS C++ EXECUTABLE
'---------------------------------------------------------
Dim ModelDirectoryPath As String
Dim ModelExecutableName As String
Dim ModelFullString As String
Dim ret As Long

ModelDirectoryPath = Range("ModelFilePath").value
ModelExecutableName = Range("ModelFileName").value
ModelFullString = ModelDirectoryPath & ModelExecutableName

' Call the model to run
Application.StatusBar = "Running C Model..."ModelFullString = ModelFullString & " " & ScenarioCounter & " " & NumDeals _
& " " & ModelRunTimeStamp
ret = Shell(ModelFullString)

' Add error checking based on return value
' This is where I want to do some checks on the return value and then start more VB code

1

Решение

1) Вы захватываете идентификатор задачи программы (это то, что возвращает Shell ()), а не какой-либо возврат из открытой программы — поэтому это 4-значное число

2) Shell () запускает все программы асинхронно.

Чтобы запустить программу синхронно или запустить ее и дождаться возврата, либо:

По сути, сделайте что-то вроде:

Set o = CreateObject("WScript.Shell")
valueReturnedFromYourProgram = o.Run( _
strCommand:="notepad", _
intWindowStyle:=1,
bWaitOnReturn:=true)
Debug.Print valueReturnedFromYourProgram
1

Другие решения

Я не уверен, что код VBA будет, но вы проверили ShellExecuteEx? Ниже приведен код C / C ++:

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
0

По вопросам рекламы [email protected]