Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > TwebBrowser в DLL


Автор: ___Felix___ 14.1.2008, 19:50
Всем доброго времени суток ;-)
У меня проблема: при вставке в DLL компонента TWebBrowser выдается ошибка "Не был произведен вызов CoInitialize".
Может я че не так делаю, но мои действия были таковы:
1) В Delphi 7 выбрал меню File - New - Other и DLL Wisard
2) File - New - Form
3) Cо вкладки Internet перетащил на форму объект WebBrowser
4) В коде формы объявил 
Код

procedure ShowWebDialog; cdecl; { cdecl потому что использовать DLL буду в VisualC}

5) В блоке implementation написал следующее
Код

procedure ShowWebDialog; cdecl;
var
  myForm: TWebForm;
begin
  ShowMessage('Hello, DLL (begin)');
  try
    myForm := TWebForm.Create(Application);
    ShowMessage('Hello, DLL (Dialog was created)');
    myForm.ShowModal;
    ShowMessage('Hello, DLL (end)');
    myForm.Free;
  except on E:Exception do
    ShowMessage('Hello, DLL (end) failed = '+E.Message);
  end;
end;

6) В файле проекта дописал
Код

exports
  ShowWebDialog;

7) Откомпилировал проект

8) Открыл VS2003 и создал Win32 Console Application для Visual C/C++
9) В папку с проектом скопировал DLL, полученную на шаге 7
10) Вот листинг сишной программы:
Код

// test_dll.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

typedef void ( *WEB_DIALOG)();

int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hinstLib; 
    WEB_DIALOG ProcAdd; 

    hinstLib = LoadLibrary(TEXT("webdlg.dll")); // webdlg.dll - наша делфийская библиотека

    if(hinstLib)
    {
        ProcAdd = (WEB_DIALOG)GetProcAddress(hinstLib, "ShowWebDialog");
        if(ProcAdd)
            (ProcAdd)();
        FreeLibrary(hinstLib);
    }
    return 0;
}


И после такого вот выскакивает сначала "Hello, DLL (begin)", а затем "Исключение неизвестное программное исключение (0x0eedfade) в приложении по адресу 0x7c81eb33." =(

Попробовал удалить WebBrowser - все нормально.
Пробовал в dll-ке делать так:
Код

procedure ShowWebDialog; cdecl;
var
  myForm: TWebForm;
  vWeb: TWebBrowser;
begin
  ShowMessage('Hello, DLL (begin)');
  try
    myForm := TWebForm.Create(Application);
    ShowMessage('Hello, DLL (Dialog was created)');
    vWeb := TWebBrowser.Create(Application);
    myForm.ShowModal;
    ShowMessage('Hello, DLL (end)');
    myForm.Free;
  except on E:Exception do
    ShowMessage('Hello, DLL (end) failed = '+E.Message);
  end;
end;

тогда выдавались сообщения "Hello, DLL (begin)", "Hello, DLL (Dialog was created)", а потом "Hello, DLL (end) failed = Не был произведен вызов CoInitialize"

Люди, помогите с этим траблом. Всю программу ведь обламывает, а исправить можно - только не знаю как =(

Автор: hhhhhhhhhhhh 24.11.2008, 04:16
Нашлось решение?
Я вот делаю плагин для Оперы. Тоже в dll используется TWebBrowser, лежащий на форме. Нормально работает, но при выгрузке плагина тоже постоянно вылетает ошибка(AV). Если заменить TWebBrowser ЛЮБЫМ(!) контролом из VCL - все работает БЕЗ ошибок. Явно трабл в TWebBrowser, а где конкретно, не могу понять. Есть какие нибудь мысли хотябы, что может быть?

Проверил вообще по простому:
  TForm1 = class(TPluginForm)
     ...
   protected
     WB: TWebBrowser;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin                   
  WB := TWebBrowser.Create(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WB.Free; // после этого вылетает ошибка(AV)
end;

И даже так вылетает AV. Че за херня не могу понять.

Автор: Viy_2007 3.12.2008, 06:59
а вызывать CoInitialize не пробовали?  smile 

Автор: hhhhhhhhhhhh 3.12.2008, 11:54
Цитата(Viy_2007 @ 3.12.2008,  06:59)
а вызывать CoInitialize не пробовали?  smile

Мда... "Тормозок, ты меня называла" smile Тупим не по детски.
Спасибо! Точно! С меня варенье!
Добавил в конец модуля с формой:
Код
initialization
  CoInitialize(nil);
 
finalization
  CoUninitialize;

Заработала!!!

пс. Раз уж Делфи сама автоматичести следить за освобождение строк(тип String) и интерфейсов(IInterface и потомков), сдесь бы тоже автоматика не помешала smile
Чайники всякие бываютsmile

Автор: Akella 29.10.2010, 13:22
Поднимаю тему, т.к. у меня схожая проблема.
Есть поток (Thead), в нём только одна процедура Execute, где создаётся сам компонент браузера.
Вот такой код
Код

procedure MktThread.Execute;
begin
  Randomize;
  while not Terminated do
    begin
      if not Assigned(WebBrowser1) then
        WebBrowser1 := TWebBrowser.Create(application); <<- здесь вываливается исключение "Не был произведен вызов CoInitialize"


      try
        WebBrowser1.Navigate('адрес сайта');



вот вызов

Код

  mkt1 := MktThread.Create(True);
  mkt1.Priority := tpLowest;
  mkt1.Resume;


в модуле потока есть вызов:

Код

initialization
  CoInitialize(nil);

finalization
  CoUninitialize;
end.

D2007, Win7

Добавлено через 9 минут и 46 секунд
По совету уважаемого Alexeis`а переместил CoInitialize(nil) и установил непосредственно перед вызовом строки создания браузера. Ошибка исчезла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)