Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Загрузка файла в Паскале

Автор: denic 10.01.2003 18:24

Здравствуйте.
Во время выполнения программы надо загружать exe-файл. Пользуюсь Exec (a,B), под win3.11.
Но файл не загружается.
(Хотел загрузить mplayer, чтобы играла фоновая музыка.)
Очень прошу помочь.  

Автор: Nexus 10.01.2003 19:58

Если надо запустить программу то есть функция ShellExecute(...). Щас не вспомню всех параметров, но не забудь добавить модуль ShellApi

Автор: mj 29.01.2003 6:50

Цитата
Если надо запустить программу то есть функция ShellExecute(...). Щас не вспомню всех параметров, но не забудь добавить модуль ShellApi

Это же в Delphi а не в паскале...

Автор: Clane 29.01.2003 18:17

Q:> А как из моей программы запустить другую?

A: С помощью процедуры Exec:

       SwapVectors;
       Exec(Путь&ИмяВашейПрограммы, Доп_Параметры);
       SwapVectors;

Q:> А почему внешняя программа из моей не запускается?

A: А память кто будет внешней проге отдавать?
  По умолчанию все 640Kb отдаются твоей программе.
  Исправить это можно либо через Options/Memory Sizes../ High heap limit,
  либо директивой компилятора:
      {$M 4096,0,10000}
  Здесь первая цифра - память под стек (в стеке размещаются локальные
  переменные каждой вызываемой процедуры/функции),
  вторая - нижняя граница памяти, третья - верхняя.
  В данном примере твоей программе отдается 10000 байт,
  а все остальное - внешней программе.

Q:> А если мне самому память нужна?

A: Используй библиотеку для своппинга (выгрузки из памяти) в XMS/EMS/Disk -
  перед запуском внешней программы твоя программа вместе со всеми данными
  переписывается в XMS/EMS или на винт, а после завершения внешней -
  восстанавливается.
  Можно воспользоваться, например, юнитом SPAWNO от Ральфа Брауна,
  или модулем OpExec из ObjectProf by TurboPower.

Автор: Proximo 31.01.2003 14:21

Вот простейший пример. Твоя программа запускает на исполнение другой ехе-файл. Смотри. В диррективе $M все стоит стандартно, кроме последней цифры - это размер кучи. Его можешь попробовать изменять экспериментально. Если ты его поставишь слишком большой, то переменная DosError будет давать код ошибки 8.

{$M 16384,0,5000}
Program Exc;

uses Dos;

begin
 Exec ('c:bpt.exe', '');
end.

Удачных экспериментов!!!

Автор: Qleek 31.01.2005 0:43

А этот алгоритм работает в вин хп? я не смог этого добиться...
прочитал хелп, переписал пример, но эффекта нет...

Автор: volvo 31.01.2005 1:21

Qleek
Посмотри здесь, был работающий пример...
http://forum.pascal.net.ru/index.php?s=&showtopic=19403&view=findpost&p=109112

Автор: Qleek 31.01.2005 2:24

Код
uses dos;
begin
swapvectors;
exec('start.exe','1024');
swapvectors
end.

Не работает... где то пол секунды держится черный экран а потом она закрывается и не запускает файл...

Автор: volvo 31.01.2005 2:39

Qleek
Покажи исходник (start.pas). Я надеюсь, файл "start.exe" находится в той же директории, что и вызывающий?

Кстати, в вызывающем модуле должна быть директива "{$m 4000, 0, 0}", ну или что-то похожее. Ее у тебя нет (а без нее - недостаточно памяти для запуска субпроцесса)