Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Получение hInstance приложения


Автор: Kostt 19.12.2007, 14:51
Здравствуйте!

Использую ShellExecuteEx для открытия различных документов.
Хочу, чтобы после открытия, окно этого документа становилось активным,
для чего получаю hInstance запущенного приложения. Проблема в том, что если экземпляр этого приложения уже запущен на момент вызова функции, в ShellExecuteEx возвращает NULL в поле hProccess. Кто-нибудь знает, как заставить его возвращать правильный HINSTANCE? Заранее благодарен.
Ниже приведен код:

Код

    SHELLEXECUTEINFO info = {0};    
    info.fMask        = SEE_MASK_NOCLOSEPROCESS ;
    info.lpFile       = strFilePath.GetBuffer(0);
    info.lpVerb          = _T( "open" );
    info.nShow        = SW_SHOW;
    info.cbSize          = sizeof( SHELLEXECUTEINFO );

    int i              = ERROR_ACCESS_DENIED ;
    bSuccess          = FALSE;

    ShellExecuteEx( &info );
    i = GetLastError();
    
    if( i == ERROR_SUCCESS ) 
    {
        bSuccess = TRUE;

        if( !info.hProcess ) //тут NULL, если приложение открывающее документ уже запущено :(
            return NULL;

        if( ::EnumWindows( (WNDENUMPROC)EnumWindowsProc, GetProcessId( info.hProcess ) ) ) 
        {
            if( !SetForegroundWindow( m_hWnd ) )
            {
                CString strLog;
                strLog.Format( _T( "Не получается SetForegroundWindow для %s\n" ), strFilePath );
                LogPtr->WriteToLog( strLog );
            }
        }
        CloseHandle( info.hProcess );
    }

Автор: zkv 19.12.2007, 15:02
какие-то проблемы возникают при использовании ShellExecuteEx (не помню какие), возможно это одна из них.
используй CreateProcess()

Автор: Kostt 20.12.2007, 11:47
CreateProcess не подходит, т.к. мне нужно открывать файл ассоциированным приложением, имя которого заранее не известно

Автор: zkv 20.12.2007, 12:21
Цитата(Kostt @  20.12.2007,  11:47 Найти цитируемый пост)
мне нужно открывать файл ассоциированным приложением, имя которого заранее не известно 

посмотри http://forum.vingrad.ru/index.php?showtopic=154980&view=findpost&p=1156797:
Цитата(dumb)

FindExecutable + CreateProcess 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)