Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++Builder] ShellExecute что не так?!  (Прочитано 9830 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« : 12-11-2009 03:58 » 

Вот код. Cитуация: нужно открыть другое приложение, если определенного файла нет
Код:
FILE *q;
AnsiString ini_F ="",dir_N ="",part ="";
dir_N = GetCurrentDir();
ini_F = dir_N + "\\conf_client.ini"; //проверяемый файл
q = fopen(ini_F.c_str(),"r");//проверям есть или нет такого файла
if (q == NULL)
    {
        part = dir_N + "\\Conf_client.exe"; //загружаемые приложение
        if(ShellExecute(NULL, "open", part.c_str(), NULL, NULL, SW_SHOWNORMAL)) //проверяю произошло ли это
           {
                Application->Terminate();
                Close();
           }
        else
           {
                ShowMessage("Файл не найден, приложение закрыто");
                Close();
           }
   }
Вот что не так? Всегда shellexecute происходит, даже если файла нет... Жаль
« Последнее редактирование: 12-11-2009 07:41 от Sel » Записан

Улыбаюсь Ага
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-11-2009 04:09 » 

а по русски рассказать теперь, что надо было сделать ? ))

насколько я понял:
1) проверить, существует ли файл "путь\conf_client.ini"
2) "щёлкнуть по файлу"

?

первое делается при помощи FileFineFirst или (CreateFile с флагами GENERIC_READ и OPEN_EXISTING в соответствующих местах)

второе - просто запуск ShellExecute. Если файла нет, ничего не откроется, если есть - откроется
« Последнее редактирование: 12-11-2009 04:12 от Алексей1153++ » Записан

alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 12-11-2009 04:45 » 

1)проверка файла "путь\conf_client.ini"
2)если его нет то запускать приложение "путь\Conf_client.exe".
ну больше интересует про ShellExecute
Цитата
просто запуск ShellExecute. Если файла нет, ничего не откроется, если есть - откроется
как проинформировать что ничего не откроется?! а то сидеть ждать и гадать открылось или нет.
Записан

Улыбаюсь Ага
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #3 : 12-11-2009 05:11 » 

alex87, можно использовать вместо ShellExecute - ShellExecuteEx и проверять параметр структуры SHELLEXECUTEINFO hProcess.
Записан
alex87
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 12-11-2009 06:08 » 

То есть... понимаю это так:
Код:
SHELLEXECUTEINFO ExecuteInfo;
ExecuteInfo.lpFile = part.c_str();
ExecuteInfo.lpParameters = "open";
ExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecuteInfo.nShow = SW_SHOWNORMAL;
// потом
if (ShellExecuteEx(&ExecuteInfo))
   {
      Application->Terminate();
      Close();
   }
else
// говорим что нет файла
но при этом ShellExecuteEx не выполняется...

В итоге использовал FileExists (подсказали насчет этой функции)
Код:
part = dir_N + "\\Conf_client.exe";
        if (FileExists(part.c_str()))
            {
              ShellExecute(NULL, "open", part.c_str(), NULL, NULL, SW_SHOWNORMAL);
              Application->Terminate();
              Close();
            }
        else
            {
              ShowMessage("Файл не найден, приложение закрыто");
              Close();
            }
« Последнее редактирование: 12-11-2009 07:43 от Sel » Записан

Улыбаюсь Ага
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #5 : 12-11-2009 07:17 » 

FileExists, FindFirst, CreateFile только проверит на наличие файла, а запустилась программа или нет не поможет.
Цитата
SHELLEXECUTEINFO ExecuteInfo;
ExecuteInfo.lpFile = part.c_str();
ExecuteInfo.lpParameters = "open";
ExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecuteInfo.nShow = SW_SHOWNORMAL;
А размер структуры установил? Еще желательно обнулить структуру ZeroMemory.
Цитата
if (ShellExecuteEx(&ExecuteInfo))
Проверять надо не результат функции а параметр ExecuteInfo.hProcess:
Цитата
hProcess
Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.

MSDN.

Проверять можно по таймауту:
Код:
if (WaitForSingleObject(ExecuteInfo.hProcess, 500) != WAIT_OBJECT_0)
ShowMessage("Приложение не запускается");
Здесь 500 - таймаут, который ждет программа на запуск приложения.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines