Help-Hell - HHC6000: Error:

Задача - сгенерировать в HTML Help Workshop приложение. При попытке сбилдить - ошибка:

HHC6000: Error: An internal file could not be created. Make certain there is enough disk space on the drive where you are compiling your file.

HHC5007: Error: Fatal navigational compilation error. This is likely the result of an invalid contents (.hhc) file.

Проблема в том, что перед билдом была выставлена галочка “Automatically create contents file .hhc when compiling”, которая находится на вкладке Files диалогового окна, которое возникает при двойном щелчке на надписи “[OPTIONS]“, которая на вкладке Project. Проблема, собственно в том, что если просто убрать галочку обратно - ситуация не решается.

Для решения проблемы нужно не просто удалить .hhc файл, и ссылку на него в .hhp-файле, но и прочистить все папки, которые будут в реестре по адресу:

HKCU\Software\Microsoft\HTML Help Workshop.

Пока не будет очищен реестр, билд не получится. Ну, и перед билдом рекомендую еще раз проверить - убрали ли галочку в этом месте…

Поскольку решения по-быстрому найти не удалось, продублирую на английском:

——————————————————————————————————————————————————————

HHC6000: Error: An internal file could not be created. Make certain there is enough disk space on the drive where you are compiling your file.

HHC5007: Error: Fatal navigational compilation error. This is likely the result of an invalid contents (.hhc) file.

I have this problem when checked checkbox “Automatically create contents file .hhc when compiling”.

When I was unchecking this checkbox, it’s not fixing problem. To checking problem, I shuld do following:

1) Unchecking checkbox

2) delete .hhc file and reference to it in .hhp files (in notepad).

3) delete all info in folders on the branch HKCU\Software\Microsoft\HTML Help Workshop in register

4) rebuild solution

Published in: on 16 Февраль 2011 at 17:35 Комментариев (0)
Метки:

Многобуквенный поиск в ComboBox.

Включается это чудо враждебной техники так:

AutoCompleteMode = AutoCompleteMode.Suggest;
AutoCompleteSource = AutoCompleteSource.ListItems;

Published in: on 2 Февраль 2011 at 17:20 Комментариев (2)
Метки:

Windows Services

Ситуация с Windows Services напрягла надолго…

В общем выводы такие:

1. Особенности создания инсталяторов для служб:

Добавить сервис - как обычно. Теперь надо сделать так, чтобы он инсталлировался.

Для этого нужно создать сервис-инсталлер в проекте (кое чего в них подправить), добавить некоторые магические заклинания в файле Program.cs (тот самый, где static main () находится, - этот файл создастся, даже если с нуля пытаться сделать проект-службу, ибо начинать с чего-то код все равно надо).

Итак - по порядку. Очень долго искал, где бы создать сервис-инсталлер. В общем - дважды щелкаем мышкой на сервисе (да, я знаю, что он будет ругаться, что это нельзя отобразить, и нужно выбрать “здеся” для просмотра кода). Так вот - никуда не щелкаем, а смотрим “Свойства”. Там внизу вкладки “Свойств”, уже на сером фоне будет видна маленькая гиперссылочка “Add Installer”. Почему она не отображается в режиме просмотра кода сервиса - я не знаю… но факт остается фактом.

wservices2

Тыкаем там, где подчеркнуто красным, и получаем класс ProgectInstaller, который содержит два компонента, - один из них настраивает саму службу, другой (serviceProcessInstaller) - ее параметры при инсталляции. Настройки самой службы позволяют изменить имя ее отображения в списке служб (параметр ServiceName) и параметры запуска (StartType) - автоматический или ручной.

serviceProcessInstaller позволяет задать свойства Account  (лучше ставить LocalSystem, т.к. LocalService и NetworkService имеют ограничения в правах - потеряли полдня чтобы понять, почему служба не могла писать в “Program Files”, - стояло LocalService).

Теперь надо бы прописать “магическое заклинание” в методе Main:

ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[] { new UInfoNetService() };

ServiceBase.Run(ServicesToRun);

Но тут есть кагбэ одно “НО”, на которое мы потратили кучку времени.

Дело в том, что служба запускается не с того каталога, где лежит *.exe файл службы (код которого приведен выше), потому все относительные пути не действуют. Для того, чтобы служба запускалась в нужном каталоге нужно прописать:

Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;

Первоначальная попытка прописать такую строчку в самой службе (в самом начале ее запуска) привела к интересному глюку - все работало, но только в дебаг-режиме. Как только служба собиралась в режиме релиза, она снова переставала “видеть” пути к базе. Потому изменить директорию было решено в самом начале Main метода (чтоб чего не вышло). Это полностью решило проблемы с относительными путями.

Ну, вроде бы в этом проекте все, теперь можно приступать к Setup-проекту.

2. Создание инсталляторов для приложений, содержащих службу

Ну, тут, в принципе все стандартно - добавляем вывод Primary Output из проекта со службой. Далее он сам увидит, что там есть служба, и скажет, что надо бы добавить “Custom Actions”, - не мешаем, они знают, что делать ;). Он пропишет эти “Primary output from UInfoServer (Active)” ко всем возможным видам действий (Inastall, Uninstall, Commit, Rollback) - это так и нужно. После этого служба будет инсталироваться при инсталляции программы и удаляться при ее деинсталляции. Правда сама по себе служба после инсталляции запускаться не будет - надо запустить ее принудительно из панели управления служб… ну или добавить в классе ProjectInstaller  метод:

protected override void OnCommitted(IDictionary savedState)

{

base.OnCommitted(savedState);

new ServiceController(UInfoNetService.ServiceName).Start();

}

Published in: on 25 Август 2010 at 15:57 Комментариев (0)
Метки: