Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

При вызове Worda в потоке - синий экран.   Найти похожие ветки 

 
Artog   (2004-08-11 21:20) [0]

Здравствуйте!
В отдельном потоке хочу работать с Wordовским документом, но программа вылетает в "синий экран".
Вот код:


type
 TForm1 = class(TForm)
   OpenDialog: TOpenDialog;
   Button1: TButton;
   WApp: TWordApplication;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 MyThread = class(TThread)
    private
     { Private declarations }
    protected
       procedure Execute; override;
 end;

var
 Form1 : TForm1;
 xThread : MyThread;
 FileName, FileTemplate, SaveChanges : OleVariant;

implementation

{$R *.DFM}

procedure MyThread.Execute;
begin
 FreeOnTerminate := True;
 Form1.WApp.Documents.Open(FileTemplate,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam,EmptyParam);
 SaveChanges := False;
 Form1.WApp.Documents.Close(SaveChanges,EmptyParam,EmptyParam);
 Form1.WApp.Disconnect;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  xThread := MyThread.Create(True);
  if OpenDialog.Execute then
     begin
        FileTemplate := OpenDialog.FileName;
        xThread.Resume;
     end;
end;


Этот же код в основном потоке работает.
Спасибо.


 
Alx2 ©   (2004-08-11 21:23) [1]

Ресурсы грамотно подели. Либо синхронизация, либо изолированные данные.


 
Sun bittern ©   (2004-08-11 21:28) [2]

Artog   (11.08.04 21:20)  

А нафига поток :(
Запущенный ворд и так уже отдельный процесс


 
Гаврила ©   (2004-08-11 21:32) [3]

С вордом то и в основном потоке работать нормально через раз получается...
Крайне криво реализованный COM сервер ((

+
[1]
+
CoInitialize не помешал бы... для потока то


 
Artog   (2004-08-11 21:35) [4]

Если вызывать в основном потоке, то пока вызывается Word на форме пропадают некоторые элементы (очень не красиво выглядит).

Какие ресурсы делить?


 
Artog   (2004-08-11 21:37) [5]

Если запускать этот код в Delphi, то ругается, что не вызван CoInitialize. Но я не нашел как его вызывать. Может подскажите?


 
Alx2 ©   (2004-08-11 21:40) [6]

>Artog   (11.08.04 21:35) [4]
>Какие ресурсы делить?
Ты имеешь Form1, которая не твоя. И все, что в ней - тоже не твое (я про "взгляд из потока"). Подозреваю, что Application (косвенно)тоже не защищен от домогательств.


 
Artog   (2004-08-11 21:42) [7]

Пробовал применить Sincronize - не помогает.


 
Artog   (2004-08-11 21:43) [8]

Пардон - Synchronize.


 
Alx2 ©   (2004-08-11 21:47) [9]

CoInitialize(Nil) вызывается.
После использования - CoUninitialize;

Я, правда, в потоках с этим делом не работал (с COM). Боюсь, буду дальше только мешать.


 
Artog   (2004-08-11 21:53) [10]

CoInitialize(Nil) - ee описание в msdn я нашел, но Delphi ругается, что идентификатор не описан. В каком модуле она описана?


 
Alx2 ©   (2004-08-11 21:59) [11]

>Artog   (11.08.04 21:53) [10]
модуль ActiveX.

По поводу COM - заведи себе внутри своего потока собственную переменную wApp и попробуй не задевать ничего больше "чужого"

То есть что-то набодобие

MyThread = class(TThread)
   private
    { Private declarations }
   protected
      WApp: TWordApplication;
      procedure Execute; override;
end;

***************

procedure MyThread.Execute;
begin
FreeOnTerminate := True;
// Конечно, wApp создать надо сначала
WApp.Documents.Open(FileTemplate,
       EmptyParam,EmptyParam,EmptyParam,
       EmptyParam,EmptyParam,EmptyParam,
       EmptyParam,EmptyParam,EmptyParam);
SaveChanges := False;
WApp.Documents.Close(SaveChanges,EmptyParam,EmptyParam);
WApp.Disconnect;
end;


 
Sun bittern ©   (2004-08-11 22:08) [12]

А так

 var
   a, b, c, d: OleVariant;
begin
 if OpenDialog1.Execute then
 begin
   a := OpenDialog1.FileName;
   b := False;
   c := Null;
   d := True;
   WordApplication1.Visible := True;
   WordApplication1.Documents.Add(a, b, c, d);
 end;
end;


 
Sun bittern ©   (2004-08-11 22:17) [13]

Кстати

SaveChanges := False;
Form1.WApp.Documents.Close(SaveChanges,EmptyParam,EmptyParam);
Form1.WApp.Disconnect;

Тока запустили и уже уходим? :)


 
3APA3A ©   (2004-08-11 23:42) [14]

Я работал с Word в потоках, но делал это не через TWordApplication, а
 
   Word := CreateOLEObject("Word.Application");
 

 и так далее...
 Но
  1) под Win2k...
  2) Delphi7


 
GanibalLector ©   (2004-08-11 23:44) [15]

Я тоже делал как и [14] и Вам советую.


 
3APA3A ©   (2004-08-12 00:00) [16]

Вообще, CreateOLEObject - очень мощная штука... С ее помощью получалось даже CorelDRAW"ом управлять, правда дальше создания документа и рисования пары примитивов дело не пошло, но суть не в этом... А про Word, Excel, Access, Outlook, PowerPoint и не говорю... (MS Publisher и InfoPath не пробовал еще...)


 
Cobalt ©   (2004-08-12 00:38) [17]

2 Artog
Повторите, пожалуйста - прога просто закрывается, или синий экран смерти наблюдаем?



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
1-1092657799
jonik_sj
2004-08-16 16:03
2004.08.29
Присвоение метода во время выполнения программы


1-1092026133
vasko
2004-08-09 08:35
2004.08.29
Перевод строки в CHAR


3-1090002748
Mister
2004-07-16 22:32
2004.08.29
1 или 2 млн. записей


1-1092682678
Seldon
2004-08-16 22:57
2004.08.29
Как задать папку для генерации DCU и EXE


1-1092235109
ron
2004-08-11 18:38
2004.08.29
Добрый день есть список файлов