?
Solved

calling C program from Visual basic and runnig both simultaneously

Posted on 2003-02-20
3
Medium Priority
?
336 Views
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?
0
Comment
Question by:soniasingh
[X]
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
3 Comments
 
LVL 22

Expert Comment

by:Mohammed Nasman
ID: 7986792
Hello

  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

0
 
LVL 26

Expert Comment

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

Accepted Solution

by:
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

'usage
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

Public Type PROCESSENTRY32
   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

Public Type OSVERSIONINFO
   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_QUERY_INFORMATION = 1024
Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SYNCHRONIZE = &H100000
'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
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)
            Loop
    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)
        Loop
        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
                'process
                lRet = EnumProcessModules(hProcess, lModules(1), 200, _
                        cbNeeded2)
                '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)
        Next
    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

0

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