我有一个从VB / Excel运行的程序,并在其中间执行C ++程序。我有两个(我认为相关的)问题:
我在执行时从C ++程序中捕获返回值,但是我获得的数字不为零(它是一个4位整数值,而是我收到的样本值是8156,5844,6100 ,5528)。我确信程序通常使用代码0退出,但我认为VB在C ++程序完成执行之前就已经获得了它的价值 - 这可以解释为什么我没有得到零值,以及我如何得到最终的,正确的从我的C ++程序返回值?
[可能作为#1的解决方案]在C ++模型完成执行之前,如何让VB程序“暂停”?模型完成后,我需要做一些额外的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
答案 0 :(得分:1)
1)您正在捕获程序的任务ID(这是Shell()返回的)而不是从打开的程序返回任何内容 - 这就是为什么它是一个4位数字
2)Shell()异步运行所有程序。
要同步运行程序或运行程序并等待返回,请执行以下操作:
使用Windows API函数(我向您推荐https://stackoverflow.com/a/5686052/1101846以获取您可以使用的选项/ API调用列表)
更容易使用Windows Scripting Host提供的WshShell对象(请参阅https://stackoverflow.com/a/8906912/1101846以获取更多示例,而不是我在下面提供的示例)。请参阅http://msdn.microsoft.com/en-us/library/d5fk67ky
基本上,做一些事情:
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);