Взаимодействие приложения с внешними программами______________383

Эта функция возвращает нуль, если ShellExecute выполнена нормально. В
противном случае возвращаются коды ошибок.

Если вы сами делаете приложение, которое будет запускаться из другого ва-
шего приложения, то в запускаемом приложении вы можете установить код ошиб-
ки функцией SetLastError:

VOID SetLastError(DWORD dwErrCode)

Заданный этой функцией код dwErrCode может затем прочесть ваша вызыва-
ющая функция. Это один из способов обмена информацией между вызывающим и
вызываемым приложениями.

Функция ShellExecute автоматически отыскивает приложение, связанное с
типом открываемого документа, и запускает его. Но иногда вам может захотеться
самому вызвать явным образом приложение, связанное с каким-то документом,
например, чтобы передать ему какие-то дополнительные параметры. Помочь в
этом может функция FindExecutable, которая возвращает имя и путь приложе-
ния, связанного с указанным файлом. Использование этой функции, как и преды-
дущих, требует включения в модуль ссылки на ShellAPI.

Функция FindExecutable определена следующим образом:

void FindExecutable(const char *FileName, const char *Directory,
char *Buffer) ;

Она позволяет получить имя выполняемого файла .ехе, связанного с файлом,
указанным параметром FileName. Параметр Directory определяет каталог по
умолчанию. Оба параметра являются указателями на строки с нулевым символом
в конце. Параметр Buffer является указателем на буфер в виде строки с нулевым
символом в конце, в который функция заносит имя и путь приложения, связанно-
го с файлом FileName.

При успешном завершении функция FindExecutable возвращает значение, бо-
льшее 32. Если возвращено меньшее значение, это свидетельствует об ошибке.
Возможные значения ошибок те же, что и для приведенных ранее функций.

Приведем пример применения функции FindExecutable. Операторы

char APchar[254] ;

FindExecutable("Doc.doc",NULL,APchar) ;

приведут к тому, что в массив APchar будет занесено имя приложения, связанного
с файлом типа Doc.doc, например:

C:\\PROGRAM FILES\\MICROSOFT OFFICE\\OFFICE\\WINWORD.EXE

Правда, при этом файл Doc.doc должен существовать в доступном каталоге.
Успешность завершения функции FindExecutable можно проверить с помо-
щью описанной ранее функции GetLastError. Если она возвращает значение не бо-
льшее 32, то значит произошла ошибка. Эту проверку могут, например, осущест-
вить следующие операторы:

int i = GetLastError();

if (i <= 32)
ShowMessage("Программа не найдена. Код ошибки "+IntToStr(i));

Выше были рассмотрены наиболее простые функции, обеспечивающие выпол-
нение каких-то программ из вашего приложения. В C++Builder и API Windows
(все приведенные выше функции относились к API Windows, хотя для единообра-
зия изложения они были приведены в нотации, подобной C++Builder) имеется так-
же ряд других функций, обеспечивающих более тонкое взаимодействие с запуска-
емыми приложениями. В частности, имеются возможности запуска нескольких
параллельно выполняемых процессов.