1

VB/Excel から実行され、途中で C++ プログラムを実行するプログラムがあります。2 つの (関連していると思われる) 質問があります。

  1. 実行時に C++ プログラムからの戻り値をキャプチャしますが、取得する数値はゼロではありません (代わりに 4 桁の整数値です。受信したサンプル値は 8156、5844、6100、5528 です)。プログラムはコード 0 で正常に終了することは確かですが、C++ プログラムが実行を完了する前に VB がその値を取得していると思います。私のC++プログラムからの戻り値?

  2. [おそらく #1 の解決策として] C++ モデルの実行が完了するまで VB プログラムを「一時停止」するにはどうすればよいですか? モデルが完成したら、追加の VB 作業 (C++ モデルの実行に基づく出力構成) を行う必要があります。

モデルの呼び出し方法に関する私の VB コードを次に示します。Windows シェルを介して完全にコンパイルされた 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 に答える