1

我有一个从 VB/Excel 运行并在其中执行 C++ 程序的程序。我有两个(我认为相关的)问题:

  1. 我在 C++ 程序执行时捕获了它的返回值,但我得到的数字不是零(而是一个 4 位整数值,我收到的样本值是 8156、5844、6100、5528)。我确定程序以代码 0 正常退出,但我认为 VB 在 C++ 程序完成执行之前获得了它的值 - 这可以解释为什么我没有得到零值,以及我如何获得最终的正确值从我的 C++ 程序返回值?

  2. [可能作为#1 的解决方案] 如何让 VB 程序“暂停”,直到 C++ 模型完成执行?模型完成后,我需要做一些额外的 VB 工作(基于 C++ 模型运行的输出配置)

这是我的模型调用方式的 VB 代码。我正在通过 windows shell 运行一个完整编译的 C++ 程序。

'---------------------------------------------------------
' 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
4

2 回答 2

1

1)您正在捕获程序的任务 ID(这是 Shell() 返回的)而不是从打开的程序中返回的任何返回 - 这就是为什么它是一个 4 位数字

2) Shell() 异步运行所有程序。

要同步运行程序或运行它并等待返回,可以:

本质上,做类似的事情:

Set o = CreateObject("WScript.Shell")
valueReturnedFromYourProgram = o.Run( _
                               strCommand:="notepad", _
                               intWindowStyle:=1, 
                               bWaitOnReturn:=true)
Debug.Print valueReturnedFromYourProgram
于 2013-08-13T16:12:58.137 回答
0

我不确定 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);
于 2013-08-13T15:41:32.603 回答