Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

При вызове 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.031 c
14-1092042550
Klerk
2004-08-09 13:09
2004.08.29
Покупаю монитор. Как протестировать?


1-1092226053
STARfish
2004-08-11 16:07
2004.08.29
Скролинг текста, отображаемого в PaintBox


14-1092034842
Rule
2004-08-09 11:00
2004.08.29
Подскажите хороший материал по ООП


14-1091809121
Мазут Береговой
2004-08-06 20:18
2004.08.29
Еще одна композиция для 2-х гитар и флейты.


14-1092130410
СержК
2004-08-10 13:33
2004.08.29
Как корректно удалить компонент?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский