09-02-2003, 09:01 AM | #1 (permalink) |
Riiiiight........
|
C++ / VBA question
So i have a executable written in C++, and i wish to call this executable in Visual Basic, and be able to read results from running the C++ program.
The C program outputs its results in a text file when it's done running. So my question is, how do I check, from Visual Basic for Applications, that the C program is done running? thanks. |
09-02-2003, 11:08 AM | #2 (permalink) |
Insane
Location: Plugged In
|
The shell command will work,but the program will continue executing as soon as the shell command is started.
shell "c:\program.exe" Also check this out: http://groups.google.com/groups?q=vi...ome.com&rnum=1 |
09-02-2003, 12:03 PM | #3 (permalink) |
WARNING: FLAMMABLE
Location: Ask Acetylene
|
Have your program idle
and periodically check in to see if the file has been written and is available... put a special marker at the end of the file.... hopefully the file won't be to long. If it is going to be long then create a 2nd file @ completion and put the marker in there. Don't forget to implement reasonable timelimits and retries in case the C++ program fails.
There are options for making the two programs communicate... using .NET, you can basically import all the C++ code and convert the main into a function and simply return a data structure with the stuff you want. But getting .NET working isn't fun :-(. It is however the most elegant solution. I don't know all the other mechanism that exist for transferring data and objects between programs, but they exist.
__________________
"It better be funny" Last edited by kel; 09-02-2003 at 12:12 PM.. |
09-02-2003, 02:07 PM | #4 (permalink) |
Riiiiight........
|
I think I will probably try the wait and check solution. I was already leaning towards this solution of having the C program generate a indicator text file when complete.
It doesn't have to be very elegant. Implementing my professor's reseach, so as long as it works reasonably well, it'll do. Problem is that I'm not familar with C++ and only somewhat competent in VBA. so I'm contented with relatively simple tricks here. |
09-02-2003, 09:44 PM | #5 (permalink) |
Junkie
Location: North Hollywood
|
ick no!!! software that periodcally checks for changes like this, bad, bad! loading regmon or filemon watching all those programs rabidly checking for registry or file changes is horrible.
even on a simple system, you are opening a can of worms. FindFirstChangeNotification, WaitForSingleObject etc implement semaphores, windows has some very powerful functions for talking between apps. http://msdn.microsoft.com arguably has the best technical docs/resources for any OS. afrer a few mins looking msdn i found this Code:
Example Program This program shows how you can use the Shell function and the GetNumTasks function to execute an MS-DOS program. This program assumes that you have the PKUNZIP program stored in the UTILS directory and that you have previously created a destination directory called DESTDIR on your hard drive. Create a new project in Visual Basic. Form1 is created by default. Add the following statements to the General Declarations section of Form1: Dim ActiveApps As Integer Private Declare Function GetNumTasks Lib "Kernel" () As Integer Add a Command Button control to Form1. Command1 is created by default. Add the following code to the Click event for Command1: Private Sub Command1_Click() Dim AppDir As String Dim Zip As String Dim Y As Integer Dim X As Integer AppDir = "c:\destdir" ActiveApps = GetNumTasks() Zip = "c:\utils\pkunzip " & "c:\destdir\" & "test.zip" & " " & AppDir X = Shell(Zip, 2) SendKeys "%{enter}EXIT%{ }n" Do While GetNumTasks() <> ActiveApps Y = DoEvents() Loop MsgBox "Pkunzip is finished", 0, "Demo Program" End Sub Then this http://support.microsoft.com/default...kb;en-us;96844 Code:
Private Declare Function GetModuleUsage% Lib "Kernel" _ (ByVal hModule%) Private Function TestFunc(ByVal lVal As Long) As Integer 'this function is necessary since the value returned by Shell is an 'unsigned integer and may exceed the limits of a VB integer If (lVal And &H8000&) = 0 Then TestFunc = lVal And &HFFFF& Else TestFunc = &H8000 Or (lVal And &H7FFF&) End If End Function Add the following code to the Form_Click event procedure of Form1: Sub Form_Click() lRet& = Shell("NOTEPAD.EXE") ' Modify the path as necessary. x% = TestFunc(lRet&) While GetModuleUsage(x%) > 0 ' Has Shelled program finished? z% = DoEvents() ' If not, yield to Windows. Wend MsgBox "Shelled application just terminated", 64 End Sub |
Tags |
question, vba |
|
|