Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Убить процесс, последствия работы с OLE, Убить процесс, последствия работы с OLE  
:(
    Опции темы
095
  Дата 11.2.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 3.10.2007

Репутация: нет
Всего: нет



Код

function GetMsWordOleName: string;
var
 RegData: TRegistry;
begin
 Result := WordOleNameDefault;
 RegData := TRegistry.Create;
 RegData.RootKey := HKEY_CLASSES_ROOT;
 try
   if RegData.OpenKey(WordOleNameRegistryKey, False)
   then
     begin
       Result := RegData.ReadString('');
       RegData.CloseKey;
     end;
 finally
   RegData.Free;
 end;
end;

....
....
MsWord := CreateOleObject(GetMsWordOleName);
....
....


Вопрос: А как избавиться от зависшего после выхода из моей проги WINWORD.EXE ? их там выстраивается штук 50 .........

MsWord.Quit(SaveChanges:=0); ессно не помогает ..
PM MAIL WWW   Вверх
kemiisto
Дата 11.2.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 1
Всего: 160



Код

MsWord.Quit;
MsWord := Unassigned;




--------------------
PM MAIL WWW GTalk Jabber   Вверх
095
  Дата 12.2.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 3.10.2007

Репутация: нет
Всего: нет



нннннеа ... не уходит

забыл добавить: word использую для проверки орфографии (через него да в программу мою результат)
вобщем, если проверка производится - то WINWORD.EXE повисает после закрытия программы, даже если проделать SaveChanges:=0
если проверка орфографии не затрагивается - ворд пропадает успешно .........

PM MAIL WWW   Вверх
kemiisto
Дата 12.2.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 1
Всего: 160



Цитата

word использую для проверки орфографии


Код в студию!


--------------------
PM MAIL WWW GTalk Jabber   Вверх
095
  Дата 12.2.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 3.10.2007

Репутация: нет
Всего: нет



Код

// Получение OLE - имени MsWord -----------------------------------------------
function GetMsWordOleName: string;
var
  RegData: TRegistry;
begin
  Result := WordOleNameDefault;
  RegData := TRegistry.Create;
  RegData.RootKey := HKEY_CLASSES_ROOT;
  try
    if RegData.OpenKey(WordOleNameRegistryKey, False)
    then
      begin
        Result := RegData.ReadString('');
        RegData.CloseKey;
      end;
  finally
    RegData.Free;
  end;
end;

// Открываем MsWord через OLE --------------------------------------------------
function ConnectToMsWord: Boolean;
begin
  try
    if not VarIsEmpty(MsWord) then ShowMsWordAndDiconnect;
    MsWord := CreateOleObject(GetMsWordOleName);
  finally
    Result := not VarIsEmpty(MsWord);
  end;
end;

// Закрыть скрытый Word --------------------------------------------------------
procedure CloseMsWord;
begin
  if not VarIsEmpty(MsWord) then
    MsWord.Quit(SaveChanges:=0);
  VarClear(MsWord);
end;

// Показать скрытый Word -------------------------------------------------------
procedure ShowMsWord;
begin
  if not VarIsEmpty(MsWord) then
    MsWord.Visible := True;
end;

// Показать скрытый Word и отключить связь -------------------------------------
procedure ShowMsWordAndDiconnect;
begin
  ShowMsWord;
  VarClear(MsWord);
end;

end.








procedure TMainFRM.MemoChange(Sender: TObject);

  // Проверка слова
  function CheckWord(const sWord: string): Boolean;
  begin
    Result := MsWord.CheckSpelling(Word := sWord);
  end;

var
  i, j, cur, iCursorPosition: Integer;
  sCurrentLine, sCurrentWord: string; // Текущая строка
begin

  if (Length(Memo.Text)>0) and (Memo.Text[Memo.SelStart]=' ') then
  begin

  cur:=Memo.SelStart;

//  Memo.SelStart := 0;

// -- Проверка по словам -------------------------------------------------------
  // Устанавиливаем текущую позицию курсора
  iCursorPosition := 0;
  for i := 0 to Memo.Lines.Count - 1 do
  begin
    // Считываем строку текста (не предложение, только одну строку!!!)
    sCurrentLine := Memo.Lines[i];
    if sCurrentLine <> EmptyStr then begin
      // Если строка не пустая, обрабатываем ее
      sCurrentWord := EmptyStr;
      for j := 1 to Length(sCurrentLine) do
        // Если текущим символ - разделитель
        if sCurrentLine[j] in WordDelims then begin
          if sCurrentWord <> EmptyStr then begin
            // ... и слово не пустое, проверяем его
            if not CheckWord(sCurrentWord) then begin
              // Если проверка не пройдена, подчеркиваем строку

//    {?}       Memo.SelStart := iCursorPosition + j - Length(sCurrentWord) - 1;
//              Memo.SelLength := Length(sCurrentWord);

              Memo.Text:=Replace(Memo.Text,sCurrentWord,'[!'+sCurrentWord+'!]');
              cur:=cur+4;

            end;
          end;
          // Очищаем текущее слово
          sCurrentWord := EmptyStr;
        end else
        begin
          // ... иначе добавляем символ к текущему слову
          sCurrentWord := sCurrentWord + sCurrentLine[j];
          // Проверка на конец строки (иначе последнее слово оставнется необработанным)
          if (j = Length(sCurrentLine)) and (sCurrentWord <> EmptyStr) then begin
            // ... и слово не пустое, проверяем его
            if not CheckWord(sCurrentWord) then begin
              // Если проверка не пройдена, подчеркиваем строку
//              Memo.SelStart := iCursorPosition + j - Length(sCurrentWord);
//              Memo.SelLength := Length(sCurrentWord);

              Memo.Text:=Replace(Memo.Text,sCurrentWord,'[!'+sCurrentWord+'!]');
              cur:=cur+4;

            end;
            // Очищаем текущее слово
            sCurrentWord := EmptyStr;
          end;
        end;
    end;
    // Увеличиваем позицию курсора на длину строки плюс символы #13#10
//    iCursorPosition := iCursorPosition + Length(sCurrentLine) + 2;
  end;
  Memo.SelStart:=cur;
  end;
end;



вот как то так, сорри за кривость
PM MAIL WWW   Вверх
volvo877
Дата 12.2.2008, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Не знаю, у меня
Код

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MsWord.Quit;
  MsWord := VarNull;
end;
отрабатывает прекрасно.

Кстати, чтоб не было кривости - посмотри: http://forum.vingrad.ru/faq/topic-156808/u...ling/index.html
PM MAIL   Вверх
095
  Дата 12.2.2008, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 3.10.2007

Репутация: нет
Всего: нет



volvo877, спецально влез среди ночи чтобы VarNull проверить smile нет .... висит! переменнаяНулл, не ворд(которыйБылВгруженИменноМною).Ехе.которыйФромТаск:=Нулл smile угадываю? 
ps: висит именно после операций по отлову орфографических ошибок ..

а Майка Хейдона завтра я испытаю, спасип smile 

Это сообщение отредактировал(а) 095 - 12.2.2008, 02:28
PM MAIL WWW   Вверх
Lunatikus
Дата 25.9.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 29.6.2007

Репутация: нет
Всего: 6



здравствуйте, у меня аналогичный вопрос по EXCEL.
За один сеанс программы запускается ExcelApplication. Документ открывается, после чего сохраняется и закрывается. Однако процесс excel.exe продолжает висеть и не исчезает без ручного удаления из дерева процессов.

знаю команду ExcelApp.Quit. Но если ее использовать перед первым открытием документа без проверки на активность оного, появляется глюк excel: открывается документ с панельками, но без рабочей области.
Какое свойство отвечает за активность прцесса?
Иными словами, как мне проверить, существует ли в дереве процессов мой зависший незакрытый процесс EXCEL?


--------------------
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.