Форум: "Основная";
Текущий архив: 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