
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
![]() |
|
|
Перейдем сразу к сабжу. Моя программа для перевода .doc в .htm (не в стиле той, что из FAQ, а гораздо сложнее -- с исправлением, дописыванием итд) почти готова. Но! После отработки программы в памяти остается процесс WINWORD.exe . Причем иногда после второго/третьего запуска программы он дублируется, иногда нет. А самое главное, что вроде бы я закрываю все правильно... с виду. Посему это будет первый вопрос -- как завершить работу с Word _правильно_, не отлавливая оставшихся процессов
![]() ![]() ![]() Но главной проблемой является другое. Иногда Ворд просто перестает нормально работать! Причем в результате работы программы ![]() Ах да, я использую раннее связывание. Переходить на позднее сейчас уже нереально, да и скорее всего решение есть более простое. ![]() ![]() type WordApplication: TWordApplication; WordDocument: TWordDocument; procedure TForm1.btnConvertClick(Sender: TObject); var fwname, fwReadonly:OleVariant; i, max_pars, pColor, redflag:Integer; paragraph_current:Paragraph; BEGIN fwname:=pathDoc.text; try begin WordApplication.Connect; fwReadonly:=True; WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); WordApplication.Visible := False; (Обработка текста документа; записей в документ и вообще каких-либо изменений в нем не делается) WordDocument.Close; WordDocument.Disconnect; WordApplication.Quit; WordApplication.Disconnect; end; except on E: Exception do begin ShowMessage(E.Message+IntToStr(E.HelpContext)); WordDocument.Close; WordApplication.Quit; end; Спасибо. Вик. |
Сообщ.
#2
,
|
|
|
Shadowy, меня насторожили вот эти строки
![]() ![]() WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); |
Сообщ.
#3
,
|
|
|
Цитата tomsksmile @ Shadowy, меня насторожили вот эти строки ![]() ![]() WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); А чем именно они настораживают? |
Сообщ.
#4
,
|
|
|
Обычно Word остается в памяти и перестает открываться, если в процессе отладки произошло ненормальное завершение. Надо убить его менеджером задач, и при новом запуске программы и все будет ОК.
|
Сообщ.
#5
,
|
|
|
Попробуй так (или проверь, как у тебя). Вместо этого:
Цитата Shadowy @ WordDocument.Close; WordDocument.Disconnect; WordApplication.Quit; WordApplication.Disconnect; напиши ![]() ![]() var f: OleVariant; ......... f := false; WordDocument1.Close(f, EmptyParam,EmptyParam); WordApplication.Disconnect; и в ИО для WordApplication: AutoConnect = false AutoQuit = True ConnectKind = ckNewInstance для WordDocument: AutoConnect = false ConnectKind = ckAttachToInterface У меня именно так работает, до этого тоже ловил Цитата "Сервер RPC недоступен". |
Сообщ.
#6
,
|
|
|
Крайне рекомендуется все com-объектам (WordApplication, WordDocument) присваивать nil по выходу. Оные присваивания вместе с Close, Quit, Disconnect лучше размещать в блоке finally. Тогда не будет необходимости дублировать их при нормальном выполнении и catch.
|