Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TwebBrowser в DLL 
:(
    Опции темы
___Felix___
Дата 14.1.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 15.1.2007

Репутация: нет
Всего: нет



Всем доброго времени суток ;-)
У меня проблема: при вставке в 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"

Люди, помогите с этим траблом. Всю программу ведь обламывает, а исправить можно - только не знаю как =(
PM MAIL   Вверх
hhhhhhhhhhhh
Дата 24.11.2008, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Нашлось решение?
Я вот делаю плагин для Оперы. Тоже в 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. Че за херня не могу понять.

Это сообщение отредактировал(а) hhhhhhhhhhhh - 24.11.2008, 17:19
PM MAIL   Вверх
Viy_2007
Дата 3.12.2008, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



а вызывать CoInitialize не пробовали?  smile 
PM MAIL   Вверх
hhhhhhhhhhhh
Дата 3.12.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) hhhhhhhhhhhh - 3.12.2008, 15:09
PM MAIL   Вверх
Akella
Дата 29.10.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329



Поднимаю тему, т.к. у меня схожая проблема.
Есть поток (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) и установил непосредственно перед вызовом строки создания браузера. Ошибка исчезла.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.