Тема: Ошибка при запуске .ехе файла с через Lisp

Есть ехе-ник. Его нужно запускать в какой-то момент.
Сделал кнопочку для следующей программки:

(defun c:TestDelphi()
  (startapp "Prj_DefineNameFile.exe")
)

Вопрос в том, что сам ехе-ник и в отладчике Delphi и отдельно при запуске отрабатывает абсолютно корректно (если нужно, запускает автокад, сохраняет текущий файл и т.д.). А вот если через кнопку запускаю, то работает неверно (путает пути, не видит имени активного документа в акаде и т.п.).
Подскажите, где хоть копать, ибо не могу понять какая разница ехе-нику откуда запускаться! Или есть?

Re: Ошибка при запуске .ехе файла с через Lisp

> Ruslan
1) Почему не прописан полный путь к exe-файлу?
2) Ты случайно не запускаешь AutoCAD из своего exe-файла? Тогда как ты можешь найти активный документ неизвестно какого AutoCAD? Ведь весь COM-интерфейс расчитан на взаимодействие только с одним AutoCAD и очень легко запутаться.

Re: Ошибка при запуске .ехе файла с через Lisp

> Александр Ривилис
1) И .lsp и .exe лежат в одной папке, которая внесена в доступные для акада пути. Впрочем прописывание полного пути дает такой-же отрицательный результат.
2) Что касается работы, то запуск акада это побочное избыточное свойство работы программы (это я неудачно пример привел). Запуск программы осуществляется только из акада (это я для тестирования голый ехе-ник гонял). А поскольку акад уже запущен, то подключаемся к нему и работаем с текущим документом. Тут путаницы быть не должно. Затем в нужный момент выполняем сохранение и копирование документа в указанное место и продолжаем работу.

Re: Ошибка при запуске .ехе файла с через Lisp

> Ruslan
Тогда я не понял что не работает. Одно небольшое замечание. Если в это время пользователь работает с AutoCAD, запущена команда/lisp-программа, то происходит Exception: Application busy (т.е. приложение занято и не отвечает). В этом случае нельзя получить ни имя активного документа, ни вообще что-либо делать с AutoCAD. Возможно это именно твой случай. Как минимум приходится дожидаться момента, пока AutoCAD станет "свободен".

Re: Ошибка при запуске .ехе файла с через Lisp

Попробую пояснить подробней.
Начнем с того как должно быть - есть .dwg, который должен быть сохранен (когда, куда, кем - это не мне интересно). При вызове программы выводится форма, на которой в поле "имя файла" (TEdit) выодится полной имя текущего файла. Если пользователь хочет сделать копию этого файла с таким-же именем, то просто нажимает кнопку "Сделать копию". Копия делается в определенное место (берется из файла .ini). Если имя файла для копии нужно другое, тогда в поле "имя файла" вводим новое имя и снова жмем "Сделать копию".
Так вот, при запущенном автокаде с открытым сохраненным файлом, голый ехе-ник отрабатывает абсолютно корректно - сохраняет копию и с текущим именем и с новым в указанную папку. Для копирования использую функцию CopyFile.
А вот если запустить через lisp, тогда с текущим именем вообще не сохраняет (выдает ошибку копирования), а вот с новым именем сохраняет, но в папку, где лежит текущий файл.
Вот собственно что не работает. Надеюсь прояснил немного. Только не спрашивайте зачем такой изврат:). Так приказала партия!)

Re: Ошибка при запуске .ехе файла с через Lisp

А вот если запустить через lisp, тогда с текущим именем вообще не сохраняет (выдает ошибку копирования)

Этого и следовало ожидать. При запуске lisp-функции блокируется активный документ.

а вот с новым именем сохраняет, но в папку, где лежит текущий файл.

А как сохраняешь? Задаешь полный путь для сохранения?
Вместо CopyFile попробуй написать свою функцию, которая бы позволила читать открытые на запись файлы.

Re: Ошибка при запуске .ехе файла с через Lisp

Насчет блокировки. После подкинутой идеи поставил проверку ошибки при копировании и  GetLastError выдал мне код 32 - Error_Sharing_Violation. Но все равно не понятно - если lisp блокирует документ, почему тогда я могу перейти при запущенной программе в акад и работать с файлом, а скопировать его не могу? И почему с новым именем он копирует этот "блокированный" файл пусть и не туда?
А вот с копированием с новым именем еще непонятней. Я беру при создании формы в переменную Х записываю полный путь к текущему файлу (зетем использую этот полный путь как первый аргумент для CopyFile). После того как пользователь ввел новое имя, я считываю его с поля и прибавляю к определенному пути (взятому из .ini) для сохранения, формируя полный путь нового файла. Затем полученный новый путь использую в функции CopyFile, как второй аргумент - файл "получатель". Казалось бы все просто, но почему файлы с новыми именами ложаться не туда куда указывает путь. Но тут хоть как-то копирует - буду смотреть почему так.
Ладно, спасиб за участие. Будем посмотреть, что можно сделать.

Re: Ошибка при запуске .ехе файла с через Lisp

Может, проще будет реактор на лиспе написать?

Re: Ошибка при запуске .ехе файла с через Lisp

> kpblc
Да задача пустяковая. Код на 60 строк со всеми обьявлениями. По сути это некий аналог SaveAs, только с некоторыми предустановками. Народу лень тратить время на поиск папок по дереву (да еще и по сети!!!), еще и помнить с какой установкой они работают, а резервные копии делать не хотят. Вот и пытаюсь что-то более-менее угадывающее их мысли навоять, да чтобы себе меньше проблем если что).

Re: Ошибка при запуске .ехе файла с через Lisp

> Ruslan
Lisp блокирует документ только на время своего выполнения. Как только он завершился - блокировка снята. А вот если ты его сохранил с другим именем, то AutoCAD по прежнему блокирует "старое имя" во время работы lisp-функции.
P.S.: А не проще тебе его сразу сохранять в нужне место, вместо того чтобы его потом копировать? И еще - не поленись и замени CopyFile на свою функцию - с системной у меня неоднократно были проблемы.

Re: Ошибка при запуске .ехе файла с через Lisp

Всем спасибо за помощь, коллеги, еще вчера разобрался. Попробую внятно объясниться, может кому тоже пригодится.
Дело не в блокировке, ибо, запустив ехе-ник, lisp-приложение завершает всою работу и текущей чертеж уже не держит (судя по результатам эксперементов). Дело все в том, что я путь для сохранения брал из ini файла, который лежал в директории откуда и запускался ехе-ник. Путь к ехе-нику определял с помощью GetDir. Так вот, для  чистого ехе-ника рабочий каталог определялся верно и данные из ini считывались правильно. А вот при запуске из акада, рабочий каталог определяся как тот, где находится текущий файл чертежа. Поэтому никакого ini файла там и в помине небыло. Вот из-за этого все проблемы и возникали. Вопрос снимается.

Re: Ошибка при запуске .ехе файла с через Lisp

> Ruslan
Ну вот. А я уже нагородил всяких теорий. :) Кстати при помощи Windows API функций несложно получить каталог из которого запускается exe-файл.