WebBrowser и потоки
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
При вызове метода 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;
в 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;
fml1, проблема у тебя такая же, как и у меня - мы плохо знаем COM
А Delphi - много чего скрывает от программиста. На сколько я понимаю, в новом потоке тебе необходимо самостоятельно инициировать COM, вызовом CoInitialize.
(Возможно поможет один вызов CoInitializeEx в начале приложения с параметром COINIT_MULTITHREADED)
Соответственно при завершении потока необходим вызов CoUninitialize.
Короче, рекомендую почитать в MSDN раздел Processes, Threads, and Apartments в COM SDK Fundamentals.

(Возможно поможет один вызов CoInitializeEx в начале приложения с параметром COINIT_MULTITHREADED)
Соответственно при завершении потока необходим вызов CoUninitialize.
Короче, рекомендую почитать в MSDN раздел Processes, Threads, and Apartments в COM SDK Fundamentals.
Даже самый дурацкий замысел можно воплотить мастерски
Проблема не решается
В потоке в методе Execute помещаю:
procedure TThread1.Execute;
CoInitializeEx(nil,COINIT_MULTITHREADED);
... some code
CoUninitialize;
end;
И CoInitialize пробовал, даже OleInitialize(nil).
Ошибка та же: Access Violation in mshtml.dll
Может не в COM дело-то?
В потоке в методе Execute помещаю:
procedure TThread1.Execute;
CoInitializeEx(nil,COINIT_MULTITHREADED);
... some code
CoUninitialize;
end;
И CoInitialize пробовал, даже OleInitialize(nil).
Ошибка та же: Access Violation in mshtml.dll
Может не в COM дело-то?
fml1, а пару CoInitialize() ... CoUninitialize пробовал?
Даже самый дурацкий замысел можно воплотить мастерски
В том то и дело, что и CoInitialize и CoInitializeEx
пробовал все равно ошибка.?
пробовал все равно ошибка.?
Я использую не веб браузер, а пользуюсь инди (у меня задача обратиться к веб-скрипту, передать и принять данные) Делаю через потоки. Вроде не выскакивают ошибки. (хотя, уверен, я не в тему :-)
fml1, используй Synchronize, т.е. добавь в thread метод с сигнатурой TThreadMethod, помести в него свой код и вызывай так: Synchronize(MyMethod)
Благодарю за помошь, попробую.используй Synchronize, т.е. добавь в thread метод с сигнатурой TThreadMethod, помести в него свой код и вызывай так: Synchronize(MyMethod)
WBW,
fml1
Спасибо огромное Euqie - помогло!