Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про ShellExecute 
:(
    Опции темы
Salatovec
Дата 29.9.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Доброго всем времени суток, имеется такой кусочек кода:

Код

...
AnsiString PathOfProg = ExtractFilePath(Application->ExeName)+"DFILFtr//Prog.exe";
ShellExecute(Handle, "open", PathOfProg.c_str(), NULL, NULL, SW_SHOWNORMAL);
Memo1->LoadFromFile(Test.txt");
...


который запускает на исполнение программу Prog.exe, результатом работы которой является файл Test.txt, который я пытаюсь подгрузить в Мемо. Проблема в следующем: Prog работает достаточно долго, а моя программапытается подгрузить файлик в мемо сразу же после запуска Prog, на что компилятор ругается, что файл занят другой программой. Как сделать так, чтобы программа ждала пока Prog.exe не завершит свою работу? Заранее спасибо!
PM MAIL   Вверх
smoke_man
Дата 29.9.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Можно попробывать  system().


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Salatovec
Дата 30.9.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



smoke_man, уважаемый, а можно поподробнее  smile 
PM MAIL   Вверх
smoke_man
Дата 30.9.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Описание system здесь.
В твоем случае:
Код

AnsiString PathOfProg = ExtractFilePath(Application->ExeName)+"DFILFtr//Prog.exe";
system(PathOfProg.c_str());
Memo1->LoadFromFile(Test.txt");



--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
aleks88
Дата 10.11.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Работаю с FibPlus.
Данная строка возвращает данные, записанные в определенном столбце БД FireBird, а данном случае это путь к файлу.

Dataset1->FieldByName("LINKFILE")->AsString;

Путь имеет обычный формат: D:\papka\file.dox (к примеру).
Необходимо открыть этот файл. Подскажите, как передать функции ShellExecute путь до файла, если она восрринимает путь, с двойным слэшэм  ? Каким образом сделать преобразование ? Или есть другой вариант, может другая функция ?

PM   Вверх
xvr
Дата 10.11.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(aleks88 @  10.11.2011,  14:36 Найти цитируемый пост)
Или есть другой вариант,

Есть - передавайте путь как есть. Двойные слеши нужны только при записи символьного литерала, run-time там будут обычные одинарные обратные слэши

PM MAIL   Вверх
aleks88
Дата 11.11.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Так то работает, попробовал открыть D:/1.txt
Но у меня предполагается, что файлы будут располагаться где то в сети, тога путь будет примерно
\\CMP27\Users\1.txt

В таком же виде они и будут храниться в базе, в текстовом варианте VARCHAR.
Путь до файла возвращается компонентом OpenDialog. Может хранить нужно как по другому ? 
Подскажите как с этим быть ?

Это сообщение отредактировал(а) aleks88 - 11.11.2011, 10:05
PM   Вверх
ZVano
Дата 11.11.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Можно просто дождаться завершения запущеного процесса.
Код

UnicodeString runCommand = "c:\\myProg.exe c:\\out.txt";//Формируем строку запуска
PROCESS_INFORMATION processInfo;

STARTUPINFOW startupInfo;
ZeroMemory(&startupInfo, sizeof(STARTUPINFOW)); // обнулить
startupInfo.cb = sizeof(STARTUPINFOW);
GetStartupInfoW(&startupInfo);

CreateProcessW(
  NULL
  , runCommand.w_str()
  , NULL //&securityProcess
  , NULL //&securityThread
  , false //inheritHandles
  , 0 //creationFlags
  , 0 //environment
  , NULL //directory.w_str()
  , &startupInfo
  , &processInfo // << Сюда будет записана информация о запущеном процессе
);

// В цикле ожидаем завершения процесса
while (true){
  DWORD exitCode = 0;
  iGetExitCodeProcess(processInfo.hProcess, &exitCode))
  if(exitCode != STILL_ACTIVE){
    break;
  }
  Application->ProcessMessages();
    Sleep(500);  
}


PS: Если задача состоит в том, чтобы время от времени брать по сети небольшие блоки данных, то лучше воспользоваться mailslots.
Очень удобная штука.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
xvr
Дата 11.11.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(aleks88 @  11.11.2011,  10:03 Найти цитируемый пост)
Но у меня предполагается, что файлы будут располагаться где то в сети, тога путь будет примерно
\\CMP27\Users\1.txt

Нормальный путь. Должно работать

PM MAIL   Вверх
aleks88
Дата 11.11.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Не работает, работает только при D:/1.txt и D:\\1.txt :(
PM   Вверх
xvr
Дата 11.11.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(aleks88 @ 11.11.2011,  13:19)
Не работает, работает только при D:/1.txt и D:\\1.txt :(

Должно работать, покажите код.

PM MAIL   Вверх
aleks88
Дата 11.11.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Работает
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShellExecute(NULL, "open", "D:\\1.txt", NULL, NULL, SW_SHOWNORMAL);
}


Тоже работает
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShellExecute(NULL, "open", "D:/1.txt", NULL, NULL, SW_SHOWNORMAL);
}


предположим, путь \\имя компьютера\папка\1.txt
в каком виде передать его функции ?

Это сообщение отредактировал(а) aleks88 - 11.11.2011, 19:09
PM   Вверх
xvr
Дата 11.11.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(aleks88 @  11.11.2011,  19:08 Найти цитируемый пост)
предположим, путь \\имя компьютера\папка\1.txt

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShellExecute(NULL, "open", "\\\\имя компьютера\\имя шары\\папка\\1.txt", NULL, NULL, SW_SHOWNORMAL);
}

PM MAIL   Вверх
aleks88
Дата 11.11.2011, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Большое спасибо, я 3 слэша ставил smile
Теперь осталось понять, как передать такой путь в функцию, если в базе он хранится как \\Имя компьютера\папка\1.txt
т.е. как преобразовать строку, добавив слэши...
PM   Вверх
xvr
Дата 13.11.2011, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(aleks88 @  11.11.2011,  20:14 Найти цитируемый пост)
Теперь осталось понять, как передать такой путь в функцию, если в базе он хранится как \\Имя компьютера\папка\1.txt
т.е. как преобразовать строку, добавив слэши... 

Еще раз повторяю - удваивать слэши нужно только когда вы записываете строку в кавычках в исходном тексте программы. Компилятор автоматически удаляет по одному слешу из такой стоки, когда компилирует программу в исполняемый код. Так что в ShellExecute во время исполнения приходит строка \\имя компьютера\имя шары\папка\1.txt
Так что если эта строка извлекается из базы данных, то ничего в ней менять не надо - слэши там такие, какие должны быть

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.