![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При вызове Worda в потоке - синий экран. [D5, Win95/98]
Artog © (2004-08-11 21:20:00)Здравствуйте!
В отдельном потоке хочу работать с 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;
Этот же код в основном потоке работает.
Спасибо.
Cobalt (2004-08-12 00:38:00) [1]2 Artog
Повторите, пожалуйста - прога просто закрывается, или синий экран смерти наблюдаем?
3APA3A (2004-08-12 00:00:00) [2]Вообще, CreateOLEObject - очень мощная штука... С ее помощью получалось даже CorelDRAW'ом управлять, правда дальше создания документа и рисования пары примитивов дело не пошло, но суть не в этом... А про Word, Excel, Access, Outlook, PowerPoint и не говорю... (MS Publisher и InfoPath не пробовал еще...)
GanibalLector (2004-08-11 23:44:00) [3]Я тоже делал как и [14] и Вам советую.
3APA3A (2004-08-11 23:42:00) [4]Я работал с Word в потоках, но делал это не через TWordApplication, а
Word := CreateOLEObject('Word.Application');
и так далее...
Но
1) под Win2k...
2) Delphi7
Sun bittern (2004-08-11 22:17:00) [5]Кстати
SaveChanges := False;
Form1.WApp.Documents.Close(SaveChanges,EmptyParam,EmptyParam);
Form1.WApp.Disconnect;
Тока запустили и уже уходим? :)
Sun bittern (2004-08-11 22:08:00) [6]А так
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;
Alx2 (2004-08-11 21:59:00) [7]>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;
Artog (2004-08-11 21:53:00) [8]CoInitialize(Nil) - ee описание в msdn я нашел, но Delphi ругается, что идентификатор не описан. В каком модуле она описана?
Alx2 (2004-08-11 21:47:00) [9]CoInitialize(Nil) вызывается.
После использования - CoUninitialize;
Я, правда, в потоках с этим делом не работал (с COM). Боюсь, буду дальше только мешать.
Artog (2004-08-11 21:43:00) [10]Пардон - Synchronize.
Artog (2004-08-11 21:42:00) [11]Пробовал применить Sincronize - не помогает.
Alx2 (2004-08-11 21:40:00) [12]>Artog (11.08.04 21:35) [4]
>Какие ресурсы делить?
Ты имеешь Form1, которая не твоя. И все, что в ней - тоже не твое (я про "взгляд из потока"). Подозреваю, что Application (косвенно)тоже не защищен от домогательств.
Artog (2004-08-11 21:37:00) [13]Если запускать этот код в Delphi, то ругается, что не вызван CoInitialize. Но я не нашел как его вызывать. Может подскажите?
Artog (2004-08-11 21:35:00) [14]Если вызывать в основном потоке, то пока вызывается Word на форме пропадают некоторые элементы (очень не красиво выглядит).
Какие ресурсы делить?
Гаврила (2004-08-11 21:32:00) [15]С вордом то и в основном потоке работать нормально через раз получается...
Крайне криво реализованный COM сервер ((
+
[1]
+
CoInitialize не помешал бы... для потока то
Sun bittern (2004-08-11 21:28:00) [16]Artog (11.08.04 21:20)
А нафига поток :(
Запущенный ворд и так уже отдельный процесс
Alx2 (2004-08-11 21:23:00) [17]Ресурсы грамотно подели. Либо синхронизация, либо изолированные данные.