Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Функция main.

 
 
 
       Каждая программа  на  С  и  C++  должна иметь функцию main;
 
  причем ваше дело,  где вы ее поместите.  Некоторые  программисты
 
  помещают ее в начале файла, некоторые в конце. Однако независимо
 
  от ее положения необходимо помнить следующее:
 
 
 
                     Аргументы функции "main".
 
 
 
       Запускающая процедура Borland C++ посылает функции main три
 
  параметра (аргумента): argc, argv и env.
 
 
 
       - argc,  целое,  -  это  число аргументов командной строки,
 
         посылаемое функции main,
 
 
 
       - argv это массив указателей на строки (char * []).
 
 
 
         Под  версией  DOS   3.x   и   более   поздними   argv[0]
 
          определяется как полный маршрут запускаемой программы.
 
 
 
         При работе под более ранними версиями DOS argv указывает
 
          на нулевую строку ("").
 
 
 
         argv[1] указывает на первую после имени программы строку
 
          командной строки.
 
 
 
         argv[2] указывает на вторую после имени программы строку
 
          командной строки.
 
 
 
         argv[argc-1] указывает на последний аргумент, посылаемый
 
          функции main.
 
 
 
         argv[argc] содержит NULL.
 
 
 
       - env также является массивом указателей на строки.  Каждый
 
         элемент env[] содержит строку вида ENVVAR=значение.
 
 
 
         ENVVAR - это имя переменной среды, типа PATH или 87.
 
 
 
         <значение> это  значение  данной  переменной  окружения,
 
          например C:\DOS;C:\TOOLS (для PATH) или YES (для 87).
 
 
 
       Заметим, однако,  что  если вы описываете некоторые из этих
 
  аргументов,  то вы должны описывать их в  таком  порядке:  argc,
 
  argv, env. Например, допустимы следующие объявления аргументов:
 
 
 
      main()
 
      main(int argc)         /* допустимо но не очень хорошо */
 
      main(int argc, char *argv[])
 
      main(int argc, char *argv[], char *env[])
 
 
 
       Объявление main(int argc) не очень  удобно  тем,  что  зная
 
  количество параметров, вы не имеете доступа к ним самим.
 
 
 
       Аргумент env  всегда  доступен  через глобальную переменную
 
  environ. Смотрите описание переменной  environ  (в  Главе  3)  и
 
  функции putenv и getenv (в Главе 2).
 
 
 
       Параметры argc  и argv также доступны через переменные_argc
 
  и _argv.
 
 
 
         Пример программы, использующей argc, argv и env.
 
 
 
       Это пример  программы   ARGS.EXE,   которая   демонстрирует
 
  простейший  путь  использования  аргументов,  посылаемых функции
 
  main.
 
 
 
      /* программа ARGS.C */
 
 
 
  #include <stdio.h>
 
  #include <stdlib.h>
 
 
 
  void main(int argc, char *argv[], char *env[])
 
  {
 
  int i;
 
 
 
  printf("Значение argc равно %d \n\n",argc);
 
  printf("В командной строке содержится %d параметров \n\n",argc);
 
 
 
  for (i=0; i<=argc; i++)
 
     printf(" argv[%d]: %s\n",i,argv[i]);
 
 
 
  printf("Среда содержит следующие строки:\n");
 
 
 
  for (i=0; env[i] != NULL; i++)
 
     printf(" env[%d]: %s\n",i,env[i]);
 
 
 
  return 0;
 
  }
 
 
 
       Предположим, что   вы   запускаете  программу  ARGS.EXE  со
 
  следующей командной строкой:
 
 
 
  C:> args first_arg "arg with blanks" 3 4 "last but one" stop!
 
 
 
       Заметим, что  вы  можете  послать  аргумент  с   пробелами,
 
  заключив   его  в  двойные  кавычки,  как  показано  на  примере
 
  "argument with  blanks"  и  "last  but  one"  в  примере  вызова
 
  программы.
 
 
 
       В результате   работы   программы   вы   получите  примерно
 
  следующее:
 
 
 
      Значение argc равно 7
 
 
 
      В командной строке содержится 7 параметров
 
 
 
         argv[0]: c:\turboc\testargs.exe
 
         argv[1]: first_arg
 
         argv[2]: arg with blank
 
         argv[3]: 3
 
         argv[4]: 4
 
         argv[5]: last but one
 
         argv[6]: stop!
 
 
 
      Среда содержит следующие строки:
 
 
 
         env[0]: COMSPEC=C:\COMMAND.COM
 
         env[1]: PROMPT=$p $g
 
         env[2]: PATH=C:\SPRINT;C:\DOS;C:\BC
 
 
 
       Максимальная общая  длина  командной   строки,   посылаемая
 
  функции  main (включая пробелы и имя самой программы),  не может
 
  превышать 128 символов; это ограничения DOS.
 
 
 
              Символы маскирования в командной строке
 
 
 
       Аргументы командной   строки   могут   содержать    символы
 
  маскирования.  При  этом  они  могут  расширяться  для всех имен
 
  файлов,  которые совпадают с аргументом так,  как это  делается,
 
  например,  с  командой  DOS  copy.  Для  использования  символов
 
  маскирования   необходимо   при   связывании   вашей   программы
 
  редактором    связей   подсоединить   к   ней   объектный   файл
 
  WILDARGS.OBJ, который поставляется с Borland C++.
 
 
 
       Если файл WILDARGS.OBJ подсоединен к вашей программе, то вы
 
  можете в командной строке использовать аргументы типа "*.*". При
 
  этом имена всех файлов,  подходящих к данной маске,  заносятся в
 
  массив argv.  Максимальный размер массива argv зависит только от
 
  объема динамической области памяти.
 
 
 
       Если под данную маску  не  нашлось  подходящих  файлов,  то
 
  аргумент  передается  в  том  виде,  в  каком  он  был  набран в
 
  командной  строке.  (Т.е.  функции   main   передается   строка,
 
  содержащая символы маскирования).
 
 
 
       Аргументы, заключенные   в   двойные  кавычки  ("..."),  не
 
  расширяются.
 
 
 
       Пример. Следующие  команды  компилируют   файл   ARGS.C   и
 
  связывают   его   с  модулем  WILDARGS.OBJ,  а  затем  запускают
 
  получившуюся программу ARGS.EXE:
 
 
 
      bcc args wildarg.obj
 
 
 
      args C:\BORLANDC\INCLUDE\*.H  "*.C"
 
 
 
       При запуске ARGS.EXE первый аргумент  расширяется  до  имен
 
  всех файлов  с  расширением  H в директории Borland C++ INCLUDE.
 
  Отметим,  что все строки  включают  полный  маршрут  (к  примеру
 
  C:\TC\INCLUDE\ALLOC.H).  Аргумент  *.C не расширяется,  т.к.  он
 
  заключен в кавычки.
 
 
 
       Если вы работаете в Интегрированном Окружении (BC.EXE),  то
 
  вам  просто  нужно  указать  в  меню  проекта имя файла проекта,
 
  который должен содержать следующие строки:
 
 
 
      ARGS
 
      WILDARGS.OBJ
 
 
 
       Затем с  помощью  команд "Run/Arguments" следует установить
 
  параметры командной строки.
 
 
 
       Замечание. Если  вы  хотите,   чтобы   обработка   символов
 
  маскирования   происходила   всегда,   т.е.  чтобы  WILDARGS.OBJ
 
  автоматически  подсоединялся  редактором   связей,   вы   должны
 
  модифицировать вашу стандартную библиотеку C?.LIB, добавив в нее
 
  файл WILDARGS.OBJ.  Для этого удалите из  библиотеки  SETARGV  и
 
  добавьте WILDARGS.  Это можно сделать с помощью следующих команд
 
  (мы подразумеваем,  что стандартные  библиотеки  и  WILDARGS.OBJ
 
  содержатся в текущей директории):
 
 
 
       TLIB описана в главе 7 "Утилиты" документа "User's Guide".
 
 
 
       tlib cs -setargv +wildargs
 
       tlib cc -setargv +wildargs
 
       tlib cm -setargv +wildargs
 
       tlib cl -setargv +wildargs
 
       tlib ch -setargv +wildargs
 
 
 
 
 
    Компиляция с использованием ключа  -p  (Соглашение  по  вызову
 
                          языка Паскаль).
 
 
 
       Если вы  компилируете вашу программу,  используя соглашение
 
  по вызову языка Паскаль (детально описано в главе 9 "Interfacing
 
  with   assembly  languige",  "Programmer's  Guide"),  вы  должны
 
  помнить, что функция main должна быть явно объявлена как функция
 
  С. Это  можно  сделать  с помощью ключевого слова cdecl примерно
 
  так:
 
 
 
      cdecl main(int argc, char *argv[], char *env[])
 
 
 
               Значение, возвращаемое функцией main.
 
 
 
       Функция main возвращает значение,  которое  является  кодом
 
  завершения программы: это целое. Однако, если ваша программа для
 
  завершения использует функцию exit (или _exit),  то возвращаемым
 
  значением будет аргумент этой функции.
 
 
 
       Например, если ваша программа содержит вызов:
 
 
 
       exit(1)
 
 
 
       то код завершения будет равен 1.
 
 
 
       Если для  запуска  программы вы используете интегрированное
 
  окружение  Borland  C++  (BC.EXE),  то  посмотреть  возвращаемое
 
  значение функции main вы можете, выбрав "File | Get Info".
 
 
 
 


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS