1

哎呀,

我正在尝试从现有的 TD6.3 应用程序中运行 .exe 程序(用另一种语言编写的小型帮助应用程序)。

根据文档,我认为这适用于 SalLoadApp(或者理想情况下适用于 SalLoadAppAndWait,因为我确实需要等待它完成并且希望它对用户不可见 - 该应用程序是一个控制台应用程序,没有可见的输出或用户交互),但试图这样调用它根本没有任何作用。我已经尝试过仅将 appname 作为参数(它与 TD 应用程序位于同一文件夹中):

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

以及完整路径:

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

我是否误解了它的工作原理或遗漏了什么?它仅适用于 TD 应用程序吗?还有另一种通过代码执行现有非 TD .exe 文件的方法吗?

4

2 回答 2

0

是的,您可以为此目的使用 SalLoadApp。该函数可用于调用任何 exe 文件(没有限制,例如只有 td exe)。例如,如果你想调用 windows 计算器就写,

SalLoadApp( "calc.exe", "" )

另外,如果要指定文件路径,请使用双斜杠(而不是单斜杠),如下所示,

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

SalLoadApp 的格式为: SalLoadApp( strAppName, strParameters )

strAppName - exe 文件的名称。

strParameters - 参数数组(strParameters 中的空格标记一个参数的结尾)。

此外,如果您想在不指定文件位置的情况下调用 salloadapp,那么您可以将这两个 exe 保存在同一个文件夹中-(HelperApp.exe 和调用应用程序)

于 2019-11-19T19:33:01.147 回答
0

使用 ShellExecuteW()。这样你有更多的控制权

1) 将其作为外部函数包含在 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)使用以下语法运行您的exe(或查找'ShellExecute'以获取更多信息)

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

3)可选地编写一个包装函数,这样你就可以检查你想要的任何返回码,例如:

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
于 2019-11-19T21:22:54.860 回答