Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть файл в родительском приложении, Как? 
V
    Опции темы
Evgeny84
Дата 5.6.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как можно открыть файл из приложения в приложении его создавшем(т.е. *.doc->MS Word и т.д.) 
switch case + Create process не катит... Хотелось бы чтобы система сама определила какое приложение соответствует данному расширению...
Конечно можно рыться в реестре и соотносить приложения расширению, но хотелось бы одной функцией...
Это реально???

Это сообщение отредактировал(а) Evgeny84 - 5.6.2007, 20:20
PM MAIL   Вверх
threef
Дата 5.6.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй shellexecute
PM MAIL   Вверх
fantast
Дата 5.6.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

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



однозначно shellexecute, отличная функция..
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Evgeny84
Дата 6.6.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



threeffantast,  спасибо сработало!
Теперь вот вопрос как из HINSTANCE  получить hProcess??? 
Смысл: отловить закрытие созданного приложения (WaitForSingleObject)

PM MAIL   Вверх
zkv
Дата 6.6.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



по поводу ассоциаций (на всякий случай):
Код

//требуется #include<shlwapi.h>
void CTestDialogDlg::OnBnClickedButton6()
{
    IQueryAssociations *iAssoc = NULL;

    HRESULT ret = NULL;
    ret = AssocCreate( CLSID_QueryAssociations, IID_IQueryAssociations, (void **)&iAssoc ); 
    if( S_OK != ret )
        return;

    ret = iAssoc->Init( NULL, L".txt", NULL, NULL );
    if(  S_OK != ret )
        return;

    DWORD dwSize = 0; 
    WCHAR *strAssoc = NULL;

    ret = iAssoc->GetString( NULL, ASSOCSTR_COMMAND, L"open", strAssoc, &dwSize ); 
    if(  S_FALSE != ret || dwSize <= 0 )
        return;
    
    strAssoc = new WCHAR[ dwSize ];

    ret = iAssoc->GetString( NULL, ASSOCSTR_COMMAND, L"open", strAssoc, &dwSize ); 
    if(  S_OK != ret )
        return;
    
    CString strMess;
    strMess.Format( _T("association for \".txt\" is:\n%ws"), strAssoc );
    AfxMessageBox( strMess );

    delete[]strAssoc; 
    iAssoc->Release();
}

Цитата(Evgeny84 @  6.6.2007,  00:32 Найти цитируемый пост)
Смысл: отловить закрытие созданного приложения (WaitForSingleObject)

ShellExecuteEx()

Это сообщение отредактировал(а) zkv - 6.6.2007, 00:41
PM MAIL   Вверх
Evgeny84
Дата 6.6.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблемма как раз в этом и состоит
флаг SEE_MASK_NOCLOSEPROCESS предпологает незакрытие процесса пока хендл не удалён...
т.е. при вызове WaitForSingleObject после открытия происходит взаимоблокировка... т.к. роитель ждёт освобождение хендла, и дочерний процесс ждёт тогоже...
Но без этого флага hProcess = NULL.
PM MAIL   Вверх
zkv
Дата 6.6.2007, 01:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



вот пример, только не говорите, что у вас он не работает  smile 
Код

void CTestDialogDlg::OnBnClickedButton7()
{
    SHELLEXECUTEINFO SInfo = {0};
    SInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    SInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    SInfo.hwnd = NULL;
    SInfo.lpVerb = NULL;
    SInfo.lpFile = "cmd.exe";        
    SInfo.lpParameters = "";    
    SInfo.lpDirectory = NULL;
    SInfo.nShow = SW_SHOW;
    SInfo.hInstApp = NULL;    
    ShellExecuteEx(&SInfo);
    WaitForSingleObject(SInfo.hProcess,INFINITE);
    CloseHandle( SInfo.hProcess );
    AfxMessageBox( "Done!" );
}

PM MAIL   Вверх
dumb
Дата 6.6.2007, 01:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(Evgeny84 @  6.6.2007,  01:01 Найти цитируемый пост)
флаг SEE_MASK_NOCLOSEPROCESS предпологает незакрытие процесса пока хендл не удалён...

сам придумал или подсказал кто? smile
короче, никаких "взаимоблокировок" нет и не будет. рабочих примеров на форуме и в сети - куча(поиск).

там другой есть нюанс - не всегда hProcess возвращается(подробности - в msdn'е). если это будет сильно мешать, то FindExecutable + CreateProcess
PM MAIL   Вверх
Evgeny84
Дата 6.6.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



dumbzkv
да что ночью то не примерещется... Проглядел и вправду не написано...

Но проблема остаётся...
Оказывается конкретно MS Word в упор не хочет закрываться пока на его процесс есть дескриптор... с cmd.exe, notepad.exe проблем не возникает...

Это сообщение отредактировал(а) Evgeny84 - 6.6.2007, 08:48
PM MAIL   Вверх
Evgeny84
Дата 6.6.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решилась использованием: FindExecutable + CreateProcess.
Всем спасибо!!!  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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