HtmlHelp зависает при создании нескольких окон
От: Sveolon  
Дата: 26.07.06 07:13
Оценка:
Задача:
В процессе работы приложения трбуется вызывать на экран файлы справки chm. Файлов несколько, и одновременно могут быть вызваны несколько одновременно. Для вызова использую:

HWND win = HtmlHelp( caller, topic_name, HH_DISPLAY_TOPIC, NULL );
где topic_name имеет вид
"c:\path1\folder 2\File123.chm:/folder/topic.htm"
caller — либо GetDesktopWindow(), либо 0

Если на момент вызова справки других окон справки не открыто, то всё проходит корректно — окно открывается и позиционируется на нужный топик.

Если же на момент открытия уже открыто окно справки с другим файлом, то при повторном вызове оба окна перестают отрисовываться, реагировать. Можно закрыть их, только закрыв основную программу.

Кстати, вызов HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0 ), как указано в msdn, не вызывает никакаго закрытия окон, поэтому и прблему не устраняет.
Re: HtmlHelp зависает при создании нескольких окон
От: Sveolon  
Дата: 17.03.07 09:39
Оценка:
Решил проблему следующим образом:


    //Пока есть проблемы при открытии нескольких окон - будем открывать по одному
    //Перед открытием окна справки закроем все предыдущие
    HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0 );    
    

    //Было замечено, что если вызывать HH_DISPLAY_TOPIC сразу после HH_CLOSE_ALL, это может привести 
    //к плачевным последствиям, вплоть до вылетания программы. Поиски информации ни к чему не привели, 
    //но экспериментальным путём выяснено, что проблема не появляется при вызове с некоторым запаздыванием.
    //Думаю, что в этом некритическом месте одна секунда - это небольшая плата за стабильность системы.
    //Возможно, есть другой путь, но я его не нашёл.
    Sleep(1000);

    HWND win = HtmlHelp( caller, topic_name, HH_DISPLAY_TOPIC, NULL );
Re: HtmlHelp зависает при создании нескольких окон
От: Аноним  
Дата: 19.03.07 12:39
Оценка:
А если вызывать html help с помощью hh.exe из каталога винды ??
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.