How would I run a .exe from within TD 6.3 program (SalLoadApp?)

413 Views Asked by At

Ahoy thar,

I am attempting to run a .exe program (a small helper app written in another language) from within an existing TD6.3 application.

Going by the documentation, I'd think this works with SalLoadApp (or ideally with SalLoadAppAndWait, since I do need to wait for it to finish and would like it to be invisible to the user - the app is a console app with no visible output or user interaction), but trying to call it like that does nothing at all. I've tried both just the appname as a parameter (it's in the same folder as the TD application):

Call SalLoadApp('HelperApp.exe', '')

as well as the full path:

Call SalLoadApp('C:\Users\user\ProjectFolder\HelperApp.exe', '')

Am I misunderstanding how this works or missing something there? Does it only work with TD applications? Is there another way of executing an existing non-TD .exe file via code?

2

There are 2 best solutions below

12
Chandralal On BEST ANSWER

Yes you can use SalLoadApp for that purpose. The function can be used for invoking any exe file(no restrictions like only td exe's). For example, If you want call windows calculator just write,

SalLoadApp( "calc.exe", "" )

Also if you want specify file path, then please use double slash(instead of singleslash) as shown below,

Call SalLoadApp('C:\\Users\user\\ProjectFolder\\HelperApp.exe', '')

The format for SalLoadApp is: SalLoadApp( strAppName, strParameters )

strAppName - Name of exe file.

strParameters - Parameter array(space in strParameters marks the end of one argument).

Also If you want call salloadapp without specifying the filelocation, then you can keep the both exe's in same folder- ( HelperApp.exe and calling application)

0
Steve Leighton On

Use ShellExecuteW(). This way you have more control

1) Include it as an external function as part of SHELL32.dll:

Library name: SHELL32.DLL
ThreadSafe: No
Function: ShellExecuteW
    Description: The ShellExecute function opens or prints a specified file. The file can be an executable file or a document file. See ShellExecuteEx also.

    Export Ordinal: 0
    Returns
        Number: DWORD
    Parameters
        Window Handle: HWND
        String: LPWSTR
        String: LPWSTR
        String: LPWSTR
        String: LPWSTR
        Number: INT

2) Run your exe with the following syntax ( or lookup 'ShellExecute' for more info )

Call ShellExecuteW( hWndNULL, "open", "C:\\Program Files (x86)\\Gupta\\TeamDeveloper6.2.1\\Your.exe", STRING_Null, STRING_Null, SW_SHOWNORMAL )

3) Optionally write a wrapper function, so you can check any return codes you want e.g. :

Select Case nRet
Case SE_ERR_FNF
    If spApplication
        Set sError = 'Either the Application, or the specified file was not found. ' || sCTRL || sCTRL ||
                'Check the Application ' || spApplication || ' and any Compatibility Packs have been installed on this machine .' || sCTRL  || sCTRL  ||
                'Check the file ' || spFile || ' exists. '
    Else
        Set sError = 'The specified file was not found. ' || sCTRL || sCTRL ||
                'Check the file ' || spFile || ' exists. '
    Break
Case SE_ERR_PNF
    Set sError = 'The specified Path was not found'
    Break
Case SE_ERR_ACCESSDENIED
    Set sError = 'The operating system denied access to the specified file.'
    Break
Case SE_ERR_ASSOCINCOMPLETE
    Set sError = 'The filename association is incomplete , invalid, or has not been defined within Windows'
    Break
Case SE_ERR_DDEBUSY
    Set sError = 'The DDE transaction could not be completed because other DDE transactions are being processed.'
    Break
Case SE_ERR_DDEFAIL
    Set sError = 'The DDE transaction failed.'
    Break
Case SE_ERR_DDETIMEOUT
    Set sError = 'The DDE transaction could not be completed because the request timed out'
    Break
Case SE_ERR_NOASSOC
    Set sError = 'There is no application associated with the given filename extension'
    Break
Case SE_ERR_OOM
    Set sError = 'There was not enough memory to launch the application'
    Break
Case SE_ERR_SHARE
    Set sError = 'Another user has this document open.'
    Break
Case 0
    Set sError = 'The operating system is out of memory or resources'
    Break
Default
    Break


If nRet <=32
If spApplication
    Call SalMessageBox( sError || sCTRL || sCTRL ||
             'File Name =  ' || spFile || sCTRL || sCTRL ||
            'Application Name = ' ||  spApplication , 'Application or File Open Error' , MB_IconStop  |  MB_Ok )
Else
    Call SalMessageBox( sError || sCTRL || sCTRL ||
             'File Name =  ' || spFile , 'File Open Error' , MB_IconStop  |  MB_Ok )
If nRet = SE_ERR_NOASSOC or nRet = SE_ERR_ASSOCINCOMPLETE
    ! Now open the OpenAs dialog from Windows to select an application from a list or browse.
    Call ShellExecuteW( hWndNULL, "open", "rundll32.exe", "shell32.dll,OpenAs_RunDLL " || spFile, STRING_Null, npShowState )
Set bOk = FALSE