WebBrowser и потоки

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

При вызове метода Click элемента IHTMLElement из WebBrowser
в Thread (потоке) выдает ошибку Access Violation ...
Без потока все работало прекрасно. При помещении кода в поток появилась ошибка. WebBrowser находится на главной форме (не в потоке).
Посоветуйте, уважаемые, может проблема с cooqies?

Вот кусок кода, вызывающий ошибку:
iAnchor.QueryInterface(IHTMLElement, iElement);
if assigned(iElement) then begin
Form1.session:= 'vkladka';
iElement.click;
while Form1.session <> '' do
Application.ProcessMessages;
break;
end;
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

fml1, проблема у тебя такая же, как и у меня - мы плохо знаем COM :) А Delphi - много чего скрывает от программиста. На сколько я понимаю, в новом потоке тебе необходимо самостоятельно инициировать COM, вызовом CoInitialize.

(Возможно поможет один вызов CoInitializeEx в начале приложения с параметром COINIT_MULTITHREADED)
Соответственно при завершении потока необходим вызов CoUninitialize.

Короче, рекомендую почитать в MSDN раздел Processes, Threads, and Apartments в COM SDK Fundamentals.
Даже самый дурацкий замысел можно воплотить мастерски
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

Проблема не решается
В потоке в методе Execute помещаю:

procedure TThread1.Execute;
CoInitializeEx(nil,COINIT_MULTITHREADED);
... some code
CoUninitialize;
end;
И CoInitialize пробовал, даже OleInitialize(nil).
Ошибка та же: Access Violation in mshtml.dll
Может не в COM дело-то?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

fml1, а пару CoInitialize() ... CoUninitialize пробовал?
Даже самый дурацкий замысел можно воплотить мастерски
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

В том то и дело, что и CoInitialize и CoInitializeEx
пробовал все равно ошибка.?
UUU
Сообщения: 310
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

Я использую не веб браузер, а пользуюсь инди (у меня задача обратиться к веб-скрипту, передать и принять данные) Делаю через потоки. Вроде не выскакивают ошибки. (хотя, уверен, я не в тему :-)
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

fml1, используй Synchronize, т.е. добавь в thread метод с сигнатурой TThreadMethod, помести в него свой код и вызывай так: Synchronize(MyMethod)
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

используй Synchronize, т.е. добавь в thread метод с сигнатурой TThreadMethod, помести в него свой код и вызывай так: Synchronize(MyMethod)
Благодарю за помошь, попробую.
WBW,
fml1
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

Спасибо огромное Euqie - помогло!
Ответить