calling C program from Visual basic and runnig both simultaneously

Posted on 2003-02-20
Medium Priority
Last Modified: 2013-11-25
I need to invoke a C program from Visual basic.This C program does some calculations which takes approx. an hour and write  results in a file. What i need is to invoke this C Program from VB and then control should come back to Visual basic program so that processing is going at the end and C program is writing data in File and user is able to work on UI(Visual basic) as well.
Is it possible?
Question by:soniasingh
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 22

Expert Comment

by:Mohammed Nasman
ID: 7986792

  Use CreateProcess API to lunch the C application, and use WaitForSingleObject API, to make your VB application wait till the lunched program finish, then the control will back to your VB applicationa will continue it's work

this is not the best option, maybe using Com Exe with Callback function will be better option, but I didn't tried that before

LVL 26

Expert Comment

ID: 7986987
IF you don't want to wait for C program to finish, Just use Shell command to start your C program

Accepted Solution

simon_thwaites earned 300 total points
ID: 7987105
You can shell to the program and make it dump the output to a text file using "> filename.txt" at the end of the command line.

Then you can check every so often to see if the app is running. Use the code below to return if its running

Msgbox IsAppRunning("c:\windows\system32\calc.exe")

Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" ( _
    ByVal lpBuffer As String, _
    ByVal nSize As Long) As Long
Public Declare Function Process32First Lib "kernel32" ( _
    ByVal hSnapshot As Long, _
    lppe As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" ( _
    ByVal hSnapshot As Long, _
    lppe As PROCESSENTRY32) As Long
Public Declare Function CloseHandle Lib "Kernel32.dll" ( _
    ByVal Handle As Long) As Long
Public Declare Function OpenProcess Lib "Kernel32.dll" ( _
    ByVal dwDesiredAccessas As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcId As Long) As Long
Public Declare Function EnumProcesses Lib "psapi.dll" ( _
    ByRef lpidProcess As Long, _
    ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function GetModuleFileNameExA Lib "psapi.dll" ( _
    ByVal hProcess As Long, _
    ByVal hModule As Long, _
    ByVal strModuleName As String, _
    ByVal nSize As Long) As Long
Public Declare Function EnumProcessModules Lib "psapi.dll" ( _
    ByVal hProcess As Long, _
    ByRef lphModule As Long, _
    ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
    ByVal dwFlags As Long, _
    ByVal th32ProcessID As Long) As Long
Public Declare Function GetVersionExA Lib "kernel32" ( _
    lpVersionInformation As OSVERSIONINFO) As Integer

   dwSize As Long
   cntUsage As Long
   th32ProcessID As Long           ' This process
   th32DefaultHeapID As Long
   th32ModuleID As Long            ' Associated exe
   cntThreads As Long
   th32ParentProcessID As Long     ' This process's parent process
   pcPriClassBase As Long          ' Base priority of process threads
   dwFlags As Long
   szExeFile As String * 260       ' MAX_PATH
End Type

   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long           '1 = Windows 95.
                                  '2 = Windows NT

   szCSDVersion As String * 128
End Type

Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260
Public Const SYNCHRONIZE = &H100000
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const hNull = 0

Public Enum ePlatform
    eWin95_98 = 1
    eWinNT = 2
End Enum

Public gDBType As String

Public Function IsAppRunning(pEXEName As String) As Boolean

    On Error Resume Next
    Select Case getVersion()
    Case eWin95_98
            Dim lProc As Long, _
    strName As String
            Dim hSnap As Long, _
    proc As PROCESSENTRY32
            hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
            If hSnap = hNull Then Exit Function
            proc.dwSize = Len(proc)
            ' Iterate through the processes
            lProc = Process32First(hSnap, proc)
            Do While lProc
                strName = StrZToStr(proc.szExeFile)
                If InStr(UCase(strName), UCase( _
    pEXEName)) Then
                    IsApplicationRunning = True
                    Exit Function
                End If
                lProc = Process32Next(hSnap, proc)
    Case eWinNT
        Dim cb As Long
        Dim cbNeeded As Long
        Dim NumElements As Long
        Dim lProcessIDs() As Long
        Dim cbNeeded2 As Long
        Dim lNumElements2 As Long
        Dim lModules(1 To 200) As Long
        Dim lRet As Long
        Dim strModuleName As String
        Dim nSize As Long
        Dim hProcess As Long
        Dim I As Long
        'Get the array containing the process id's for each process object
        cb = 8
        cbNeeded = 96
        Do While cb <= cbNeeded
            cb = cb * 2
            ReDim lProcessIDs(cb / 4) As Long
            lRet = EnumProcesses(lProcessIDs(1), cb, cbNeeded)
        NumElements = cbNeeded / 4
        For I = 1 To NumElements
            'Get a handle to the Process
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
            Or PROCESS_VM_READ, 0, lProcessIDs(I))
            'Got a Process handle
            If hProcess <> 0 Then
                'Get an array of the module handles for the specified
                lRet = EnumProcessModules(hProcess, lModules(1), 200, _
                'If the Module Array is retrieved, Get the ModuleFileName
                If lRet <> 0 Then
                    strModuleName = Space(MAX_PATH)
                    nSize = 500
                    lRet = GetModuleFileNameExA(hProcess, lModules(1), _
                    strModuleName, nSize)
                    strModuleName = Left(strModuleName, lRet)
                    'Check for the client application running
                    If InStr(UCase(strModuleName), _
    UCase(pEXEName)) Then
                        IsApplicationRunning = True
                        Exit Function
                    End If
                    'List1.AddItem Left(strModuleName, lRet)
                End If
            End If
            'Close the handle to the process
            lRet = CloseHandle(hProcess)
    End Select
End Function

Function StrZToStr(pString As String) As String
   StrZToStr = Left$(pString, Len(pString) - 1)
End Function

Public Function getVersion() As ePlatform
   Dim osinfo As OSVERSIONINFO
   Dim lRetVal As Integer
   osinfo.dwOSVersionInfoSize = 148
   osinfo.szCSDVersion = Space$(128)
   lRetVal = GetVersionExA(osinfo)
   getVersion = osinfo.dwPlatformId
End Function


Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
This article describes how to use a set of graphical playing cards to create a Draw Poker game in Excel or VB6.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question