C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запуск HtmlHelp *.chm, Ошибка при запуске
Asenka
Отправлено: 09.09.2005, 23:45


Ученик-кочегар

Группа: Участник
Сообщений: 4



Имеем следующий код:
CODE

typedef HWND (WINAPI *HTMLHELPPROC)(HWND, LPCSTR, UINT, DWORD);

void __fastcall TForm::ButtonClick(TObject *Sender)
{
   HWND handle;
   char *path = "help.chm";
   HINSTANCE hmodHelp;
   HTMLHELPPROC lpfnHtmlHelp;
// Explicitly link to the htmlhelp control.
   hmodHelp = LoadLibrary("hhctrl.ocx");
   if (hmodHelp) {
       lpfnHtmlHelp = (HTMLHELPPROC)GetProcAddress(hmodHelp, ATOM_HTMLHELP_API_ANSI);
       if (lpfnHtmlHelp) {
// Display help using HtmlHelp engine.
           lpfnHtmlHelp(handle, path, HH_DISPLAY_INDEX, 0);
       }
   }
}


При выполнении выдает — "Недостаточно памяти для выполнения приложения, закройте одно или несколько приложений и повторите попытку" (вольный перевод). Никто не может подсказать где ошибка?
Guest
Отправлено: 10.09.2005, 10:28


Не зарегистрирован







А где у вас значение ATOM_HTMLHELP_API_ANSI ?
И HH_DISPLAY_INDEX ?

Asenka
Отправлено: 10.09.2005, 15:25


Ученик-кочегар

Группа: Участник
Сообщений: 4



QUOTE (Guest @ 10/09/2005, 10:28)
А где у вас значение ATOM_HTMLHELP_API_ANSI ?
И HH_DISPLAY_INDEX ?

2Guest: они прописаны во включенном файле
CODE
#include <htmlhelp.h>

ATOM_HTMLHELP_API_ANSI кажется что-то вроде "HtmlHelpA" (выбирается Ansi или Unicode)
а HH_DISPLAY_INDEX = 0x0002
xim
Отправлено: 10.09.2005, 15:28


Станционный диспетчер

Группа: Участник
Сообщений: 143



2Guest: см. htmlhelp.h

2Asenka:

Ошибка в использовании какой-то переменной (неинициализированной) — handle. Подставляем туда "оконный" хендл — FormXXX->Handle (зачем — будет видно ниже)

Я бы порекомендовал использовать ATOM_HTMLHELP_API_UNICODE и изменить
CODE

typedef HWND (WINAPI *HTMLHELPPROC)(HWND, LPCSTR, UINT, DWORD);
...
char *path = "help.chm";

на
CODE

typedef HWND (WINAPI *HTMLHELPPROC)(HWND, WCHAR*, UINT, DWORD);
...
WCHAR *path = L"help.chm";


Кроме того переменную hmodHelp переносим в класс, живущий в течение необходимости использования Help-а.

Перед LoadLibrary делаем проверку на загруженность модуля:
GetModuleHandle("hhctrl.ocx"). Если возвращает NULL, то делаем LoadLibrary.

С FreeLibrary (который делать желательно), не так все просто. Можно конечно забить на него, но это не очень хорошо. Поэтому перед закрытием FormXXX через FindWindowEx находим все дочерние от FormXXX окна и грохаем их. Затем делаем FreeLibrary(hmodHelp).
Asenka
Отправлено: 10.09.2005, 18:39


Ученик-кочегар

Группа: Участник
Сообщений: 4



xim, спасибо большое. Заработало smile.gif

Вернуться в Вопросы программирования в C++Builder