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, спасибо большое. Заработало |
|