78 / 78 / 11
Регистрация: 02.12.2011
Сообщений: 296

Восстановление относительного пути

02.06.2013, 07:55. Показов 1282. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане! Возникла такая проблема: необходимо при нажатии на клавишу запустить дочерний процесс - код ниже:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TConDesForm::BtnViewDataSheetClick(TObject *Sender)
{
// Создаем и запускаем новый поток
   TMemoryStream* M1 = new TMemoryStream();
// Создаем и запускаем новый поток, в который будем читать данные из ячейки
   TStream *B1=ADOTableConDes->CreateBlobStream(ADOTableConDes->FieldByName("DtSh"), bmRead);
// Копируем в поток "М1" данные из потока "В1"
   M1->CopyFrom(B1, B1->Size);
// Данные из потока "М1" записываем во временный файл
   M1->SaveToFile("Template.PDF");
// Закрываем оба потока
   delete B1;
   delete M1;
// Запускаем дочерний процесс
   spawnlp(P_WAIT, "SumatraPDFPortable\\SumatraPDFPortable", "SumatraPDFPortable\\SumatraPDFPortable", "Template.PDF", NULL);
// Теперь уничтожаем временный файл
   DeleteFile("Template.PDF");
}
Программа просмотра файлов PDF находится в своей папке, которая, в свою очередь, помещена в каталог с моим приложением. В последний также сохраняется и временный файл (Template.PDF). Все идет хорошо до тех пор, пока с помощью какого-либо FileDialog (не важно какого - даже совершенно не связанным данным окном) не откою (или наоборот - выгружу) файл. После этого происходит потеря пути (именно потеря: если работать с каталогом собственного приложения и за его пределы не выходить - все нормально). Замена строчки на такую:

C++
1
2
// Запускаем дочерний процесс
   spawnlp(P_WAIT, "SumatraPDFPortable/SumatraPDFPortable.exe", "SumatraPDFPortable/SumatraPDFPortable", "Template.PDF", NULL);
ничего не дала.

Вопрос: может кто сталкивался с такой проблемой и подскажет как ее решить.
Важное уточнение: использовать абсолютный путь - нельзя, сегодня приложение в одном из каталогов диска "J"; завтра - "D" и т. д.

Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2013, 07:55
Ответы с готовыми решениями:

БД задание относительного пути
Как проложить путь к БД так что бы при запуске на другом ПК на котором путь определяется другое имя диска ? Как сделать так что оно...

GetOpenFileName получение относительного пути
Использую такой код: OPENFILENAME ofn; wchar_t szFile; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ...

Восстановление кратчайшего пути в графе
Есть алгоритм нахождения кратчайших путей(Флойд), а как восстановить путь как узнать через какие вершины он прошел?туплю прогаю с утра)) ...

3
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
02.06.2013, 09:18
C++
1
2
3
AnsiString sPathToApp = IncludeTrailingPathDelimiter(ExtractFilePath(Application->ExeName));
// Запускаем дочерний процесс
spawnlp(P_WAIT, sPathToApp+"SumatraPDFPortable", sPathToApp+"SumatraPDFPortable", "Template.PDF", NULL);
и побарабану, что на каком диске, если я правильно понял задачу.
или
C++
1
2
3
4
AnsiString sPathToApp = IncludeTrailingPathDelimiter(ExtractFilePath(Application->ExeName))
                        +"SumatraPDFPortable";
// Запускаем дочерний процесс
spawnlp(P_WAIT, sPathToApp, sPathToApp, "Template.PDF", NULL);
только вот называть все папки одним именем - это очень большое фу.
1
78 / 78 / 11
Регистрация: 02.12.2011
Сообщений: 296
02.06.2013, 09:24  [ТС]
...большущее спасибо!!..и еще вопрос: для указанных процедур какие-либо заголовочные файлы ("шапки") подключать надо?...просто до этого всегда работал на C# - и таких проблем не было...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
02.06.2013, 09:37
нет, не надо, работает "из коробки".
для общего развития:
IncludeTrailingPathDelimiter returns the path with a path delimiter ('/' or '\') at the end. This function is MBCS (Multi Byte Character String) enabled.
, в принципе, можно обойтись и без этой функции, проставляя "\\" ручками, т.е., просто
C++
1
ExtractFilePath(Application->ExeName)
, посмотреть, что возвращает функция. можно самфым обычным способом:
C++
1
ShowMessage(ExtractFilePath(Application->ExeName));
C++
1
ShowMessage(IncludeTrailingPathDelimiter(ExtractFilePath(Application->ExeName)));
IncludeTrailingPathDelimiter
IncludeTrailingBackslash
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2013, 09:37
Помогаю со студенческими работами здесь

Восстановление пути из алгоритма Форда-Беллмана
Реализовал алгоритм Форда-Беллмана, но не получается правильно восстановить пути, подскажите, где ошибаюсь. #define...

Восстановление пути по матрице, возвращаемой алгоритмом Флойда - Уоршелла
Делаю, алгоритм флойда-уоршелла, делаю сам на делфи, но исходники с решением моей проблемы (ну по крайней мере я надеюсь, что с решением)...

Из относительного пути в абсолютный путь
Знаю, что примерно такая тема в форуме была, но найти не могу... Как из строки типа ../doc/readme.txt при наличии пути типа c:/tmp/...

Запуск программы из относительного пути в командной строке
У меня запускается вот такой файл e:\!_svn\e-dec-v2\Installed\NSIS\makensis.exe install.nsi для начала я попробовал так set...

Использование относительного пути - открыть файл рядом с exe
Народ, помогите. Как при работе с файлами в си открывать файл из папки, лежащей рядом с exe'шником Вот код: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru