控制VB和C ++之间的程序流程

时间:2013-08-13 15:34:19

标签: c++ vba flow

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

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

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

  3. 这是我的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
    

2 个答案:

答案 0 :(得分:1)

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

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

要同步运行程序或运行程序并等待返回,请执行以下操作:

基本上,做一些事情:

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

答案 1 :(得分: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);