Системная функция Turbo C++, запускающая исполняемый файл

Как запустить любой exe-файл из turbo C++? Я знаю, что мне следует прекратить использовать Turbo C++ и перейти на Dev или Code::Blocks, но моя школа не согласна, поэтому я должен это сделать.

Я просто хочу знать, как запустить файл с функцией system() или без нее. Любые советы приветствуются

Вот что я пробовал до сих пор:

1

#include<process.h>
int main()
{
    system("tnfsv13.exe");     //tnfsv being a 16-bit application(The need for slowness v 13)
    return 0;
} 

2

  #include<process.h>
    int main()
    {
        system("tnfsv13.bat");     
         return 0;
    } 
  1. tnfsv13.bat:

    запустите "c:\TurboC3\BIN\" tnfsv13.exe

ПРИМЕЧАНИЕ. Ребята, я сомневаюсь: system() не работает в Windows XP. Я попробовал это с помощью dosbox в windows 7, и он работает хорошо, но в XP он абсолютно ничего не делает. Кажется, что даже команда system("dir") не работает, но system(NULL) возвращает 1. Есть предположения, почему?

Спасибо.


person Kshitij    schedule 29.06.2015    source источник
comment
system() должен работать и в Turbo C++. Что вы пробовали, и каков был результат? [Если вы используете 16-битную версию TC++ для DOS, у вас может возникнуть проблема с тем, что она не может запустить 32-битный исполняемый файл?]   -  person Mats Petersson    schedule 29.06.2015
comment
@Kshitij Также должны работать fork()/exec(), если вам не нужно использовать system().   -  person πάντα ῥεῖ    schedule 29.06.2015
comment
Должен любить школы, которые готовят учащихся к жизни в быстро меняющемся, постоянно меняющемся мире программного обеспечения, обучая их технологиям 20-летней давности.   -  person user4581301    schedule 29.06.2015
comment
@MatsPetersson Я загрузил то, что пробовал, и оба способа не помогли. Я исправил 16-битную и 32-битную проблему (вместо этого использовал 16-битное приложение), но если это можно обойти, сообщите мне.   -  person Kshitij    schedule 29.06.2015
comment
И что именно происходит, и чем это отличается от того, что вы ожидаете?   -  person Mats Petersson    schedule 29.06.2015
comment
@MatsPetersson ничего точно не происходит, есть только пустой экран. Система (NULL) показывает 1, система (каталог) работает нормально, но ничего не может запустить.   -  person Kshitij    schedule 29.06.2015
comment
Что на самом деле должен делать .exe, который вы запускаете? Работает ли он, если вы запускаете его самостоятельно?   -  person Mats Petersson    schedule 29.06.2015
comment
Вы пытаетесь замедлить свой компьютер, чтобы обойти давно известную ошибку в коде запуска, который измеряет задержку? Я предполагаю, что это не работает по нескольким причинам: Программа, которую вы пытаетесь запустить, может быть TSR. Нельзя так начинать, наверное. И уже слишком поздно, потому что на тот момент инициализация задержки уже произошла.   -  person Sebastian    schedule 30.06.2015
comment
@MatsPetersson, это игра для DOS. И да, это работает. Себастьян, я просто любитель, чувак. До недавнего времени я даже не знал, что Turbo C++ такой старый.   -  person Kshitij    schedule 30.06.2015
comment
Извините, если tnfsv — это игра, то мое предположение было совершенно неверным. Может быть, эта ошибка, которую я помнил, происходит только с Turbo Pascal, а не с Turbo C.   -  person Sebastian    schedule 01.07.2015
comment
@ Себастьян, хм, тоже точно не помню, но я думаю, что в С++ не было блока ЭЛТ. А также есть исправления для ошибки времени выполнения CRT, не связанные с замедлением работы компьютера (есть исправленные библиотеки crt и парчи)   -  person Spektre    schedule 08.05.2018


Ответы (2)


Вы также можете использовать функцию Turbo C++ execl(). execl() загружает и запускает C:\\TC\\BIN\\tnfsv13.exe. NULL означает, что нет аргументов для отправки tnfsv13.exe. Если возникает ошибка, execl() возвращает -1 в int c.

#include<stdio.h>
#include<process.h>

int main()
{
    int c = execl("C:\\TC\\BIN\\tnfsv13.exe", NULL);


    return 0;
}

Объяснение:

execl() loads and executes a new child process.  Because the child
process is placed in the memory currently occupied by the calling
process, there must be sufficient memory to load and execute it.

'pathname' specifies the file name of the child process.  If
'pathname' has a file name extension, then only that file is searched
for. If 'pathname' ends with a period (.), then 'pathname' without an
extension is searched for.  If that filename is not found, then
".EXE" is appended and execl() searches again.  If 'pathname' has no
extension and does not end with a period, then execl() searches for
'pathname' and, if it is not found, appends ".COM" and searches
again.  If that is not found, it appends ".EXE" and searches again.

 'arg0', 'arg1',...'argn' are passed to the child process as command-
line parameters.  A NULL pointer must follow 'argn' to terminate the
list of arguments. 'arg0' must not be NULL, and is usually set to
'pathname'.

The combined length of all the strings forming the argument list
passed to the child process must not exceed 128 bytes.  This includes
"n" (for 0-n arguments) space characters (required to separate the
arguments) but does not include the null ('\0') terminating
character.

   Returns:     If execl() is successful, it does not return to the
                calling process. (See the spawn...() routines for a
                similar function that can return to the calling
                process). If an error occurs, execl() returns -1 to
                the calling process. On error, 'errno' (defined in
                <errno.h>) is set to one of the following values
                (defined in <errno.h>):

                E2BIG       Argument list or environment list too big.
                              (List > 128 bytes, or environment > 32k)
                EACCES      Locking or sharing violation on file.
                              (MS-DOS 3.0 and later)
                EMFILE      Too many files open.
                ENOENT      File or path not found.
                ENOEXEC     File not executable.
                ENOMEM      Not enough memory.

     Notes:     Any file open when an exec call is made remains open
                in the child process.  This includes
                'stdin','stdout', 'stderr', 'stdaux', and 'stdprn'.

                The child process acquires the environment of the
                calling process.

                execl() does not preserve the translation modes of
                open files.  Use setmode() in the child process to
                set the desired translation modes.

                See the spawn...() routines for similar though more
                flexible functions that can return to the calling
                program.

   Caution:     The file pointers to open buffered files are not
                always preserved correctly.  The information in the
                buffer may be lost.

                Signal settings are not preserved.  They are reset to
                the default in the child process.

-------------------------------- Пример ----------------- ----------------

The following statements transfer execution to the child process
"child.exe" and pass it the three arguments "child", "arg1",
and"arg2":

       #include <process.h>    /* for 'execl' */
       #include <stdio.h>      /* for 'printf' and 'NULL' */
       #include <errno.h>      /* for 'errno', 'ENOENT' and 'ENOMEM' */

       main()
       {
           execl("child.exe", "child", "arg1", "arg2", NULL);
           /* only get here on an exec error */
           if (errno == ENOENT)
               printf("child.exe not found in current directory\n");
           else if (errno == ENOMEM)
               printf("not enough memory to execute child.exe\n");
           else
               printf("  error #%d trying to exec child.exe\n", errno);
       }
person Software_Designer    schedule 30.06.2015
comment
Итак, что мне делать? Не могли бы вы объяснить, что делает присвоение этого значения целому числу? Кроме того, значение, возвращаемое c, равно -1. - person Kshitij; 30.06.2015
comment
Я понимаю это, и это означает, что execl() имеет ошибку. Нет ли способа сказать, что это за ошибка? и я до сих пор не понимаю, как присвоение его целому числу может запустить файл. Уточните, пожалуйста? Спасибо! - person Kshitij; 30.06.2015

system() работает нормально, хотя может работать не совсем так, как вы ожидаете: он делает то же самое, что и ввод команды в командной строке MSDOS (или Win32), включая ввод и вывод, подключенные к консоли.

Если вы хотите просто запустить программу, передать параметры, а не возвращаться из нее, используйте удобную форму из семейства функций exec(). См. это для одного примера.

person wallyk    schedule 29.06.2015
comment
Я попробую exec(), но system() показалась мне простой, поэтому я сначала попробовал ее. Я также читал о spawnl и spawnv, их тоже можно использовать? - person Kshitij; 29.06.2015
comment
@Kshitij: Да, spawn() особенно хорош в среде Microsoft из-за неуклюжести управления процессами MS. - person wallyk; 30.06.2015
comment
@Kshitij: обратите внимание, что добавление расширения исполняемого файла к команде игнорируется. Если есть несколько файлов, отличающихся только расширением, вы не можете указать, какой из них запускать с расширением: DOS следует своим собственным правилам, для какого из них выполнять. Насколько я помню, он сначала пытается .COM, затем .EXE, а затем .BAT. В современных версиях Windows см. переменную среды PATHEXT. В соседней системе Win 7 значение равно PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC. - person wallyk; 30.06.2015
comment
Спасибо за эту информацию! Поскольку я всего лишь новичок, я не мог понять определения, данные в С++, поэтому понимание exec и spawn довольно сложно. попробую отпишусь о результатах - person Kshitij; 30.06.2015