Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2009, 12:19   #1
neo-210
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 21
Вопрос Проблема связана с запуском exe фалов!

Привет всем, и заранее спасибо если кто поможет! У меня есть такая проблемка (поиск к сожалению не помог), я запускаю с помощью winexec или ShellExecute из свое программы написанной на дельфи exe-шник написанный на паскале, и теперь самое главное, если в коде паскалевского exe-шника встречается любая функция работы с внешними фалами (типо assign и прочее) работа програмы сразу слетает если запускается через приложение из дельфи, хотя если запустиь самому разумеется все работает! В чем проблема? Я сейчас пытаюсь разобраться с createprocess(возможно чтото прояниться), но я никак немогу понять в чем проблема!

Собственно я пишу приложение которое должно проверять правильность работы паскалевского экзешника, проверку я пытаюсь осуществить через текстовые фалы, тоесть в своей программе я регестрирую все данные о паскалевском exe-шнике, и параметры на вход которые сохраняются в txt, а паскалевский exe шник должен их считать, проработать и записать ответ также в txt и результаты я сверяю, но как я уже сказал при запуске из под дельфи работа с фалами у exe шника слетает! Очень буду рад если вы подскажете как выкрутиться, или если знаете, подскажите как еще можно реализовать проерку! Есть ли какая либо возможность передовать программе параметры а потом их считывать без применения txt документов как я описывал выше?
neo-210 вне форума Ответить с цитированием
Старый 09.01.2009, 12:49   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Может вы не закрываете файл перед тем как отдать работу паскалевской проге?
FaTaL вне форума Ответить с цитированием
Старый 09.01.2009, 12:59   #3
neo-210
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 21
По умолчанию

По началу я тоже так подумал, позже я начал тестировать все это дело, в итоге получилось что это никак не влияет!
neo-210 вне форума Ответить с цитированием
Старый 09.01.2009, 13:52   #4
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

Попытался повторить, работает, хоть с прогой на паскале, хоть с консольной на Delphi. Единственное о что у меня споткнулась прога - это программа которая тестирует пытается прочитать доступ к файлу ДО ТОГО как тестируемая программа создала этот файл.

То есть, при тестировании необходимо запустить процесс и дождаться его завершения, потом уже смотреть что получилось.
DelDev вне форума Ответить с цитированием
Старый 09.01.2009, 14:03   #5
neo-210
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 21
По умолчанию

DelDev: Можеш кинуть мне твой исходник, посмотрю может я где ляпочку допустил, ты запускал через какую функцию? Если ктонибудь знает как можно есчо справится помогите плиз!

Последний раз редактировалось neo-210; 09.01.2009 в 14:29.
neo-210 вне форума Ответить с цитированием
Старый 09.01.2009, 15:10   #6
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

У меня сделан простой примерчик. Реализовано это все дело так:

В файле input.txt слово "File", программа на паскале (tst.exe и tst.pas) открывает этот файл, добавляет к нему слово "new!" И пишет в файл output.txt

Код проверяющей процедуры выглядит так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  cmd: string;
  sResult: TStringList;
  f: TextFile;
  s: string;
begin
  // результат работы консоли нужен для RunDosAndWait
  sResult := TStringList.Create;
  //подготавливаем путь
  cmd := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
  cmd := cmd + 'tst.exe';
  //запускаем и ждем когда завершится
  RunDosAndWait(cmd, sResult);
  //проверяем результат
  AssignFile(f, 'output.txt');
  Reset(f);
  Readln(f, s);
  if s = 'File new!' then
  memo1.Lines.Add('выполнено успешно') else memo1.Lines.Add('не выполнено');
  CloseFile(f);
  sResult.Free;
end;
Функция RunDosAndWait в исходниках - выдернута из одного из проектов. Она реализована на основе CreateProcess, но как я и говорил - все работает и просто через WinExec только нужно дождаться когда отработает и запишется файл.
Вложения
Тип файла: zip source.zip (260.6 Кб, 12 просмотров)
DelDev вне форума Ответить с цитированием
Старый 09.01.2009, 16:29   #7
neo-210
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 21
По умолчанию

DelDev: Спасибо большое, вроде работает, но теперь появилась новая проблемка, и теперь я понял в чем состояла моя прошлая ошибка, если exe-шник находится в папке с главной программой то все нормально запускается, а если в произвольном каталоге то запуск не происходит, точнее запуск происходит но как только у нее код доходит до assign прога слетает, мне же к сожалению нужно чтобы запускало именно из произвольного каталога, так как запускаемых файлов по замыслу проекта будет около 30 и они по разным критериям должны находится в разных каталогах. Пути прописаны 100% правильно. Я с самого начало не понял в чем реальная ошибка, но теперь я немогу понять как запустить файл с произвольного каталога, и почему же прога слетает Может быть есть у кого-нибуть какието идеи?

Последний раз редактировалось neo-210; 09.01.2009 в 16:33.
neo-210 вне форума Ответить с цитированием
Старый 09.01.2009, 16:36   #8
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

Значит запущенная программа не находит файл с исходными данными. Попробуй использовать SetCurrentDir перед запуском и указывать каталог где фактически лежит нужная в данный момент программа.
DelDev вне форума Ответить с цитированием
Старый 09.01.2009, 17:35   #9
neo-210
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 21
По умолчанию

DelDev:Я честно говоря не совсям точно тебя сейчас понял! В главной программе я точно указываю нахождение запускаемого файла, но если ты говориш про паскаль, то никак немогу догнать как там использовать функцию SetCurrentDir , в Delphi то она работает. А как определять путь к фалу в паскале чето пока найти немогу, по паскалю вообще мало информации имеется по сравнению с тем же дельфи. Мне даже стало интересно, в паскале есть функция getdir но она требует предварительно знать название диска, а я то его незнаю зарание, а процедуры для определения диска я тоже найти немогу, блин.... В дельфи все намного проще...

Последний раз редактировалось neo-210; 09.01.2009 в 17:45.
neo-210 вне форума Ответить с цитированием
Старый 09.01.2009, 17:42   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

ShellExecute используйте:
Код:
implementation
 uses ShellAPI;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
Var S, S0 :String;
begin
 S := 'C:\Windows\Notepad.exe';
 S0 := ExtractFilePath(S);
  ShellExecute(Handle, nil, PChar(S), nil, PChar(S0), SW_Normal);
end;
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dev-C++ проблема с запуском программ Надюха Помощь студентам 12 28.05.2008 03:55
MASM.exe помогите пожалуйста с запуском FlyingRat Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 03.05.2007 20:06
проблема с запуском Delphi6 xen Общие вопросы Delphi 2 18.03.2007 01:16