Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

<B>DLL</B> не грузится, если в ней <B>TChart</B> [D7, WinXP]


Страницы:   1 2 3

vlad2 ©   (2009-10-21 14:12:00) 

Если в DLL помещаю объект типа TChart, то библиотека перестаёт грузиться, при этом GetLastError даёт 0 ("Операция успешно завершена").
Как создать TChart в DLL?
Спасибо.


vlad2   (2009-10-23 16:38:00) [1]


> Сергей М. ©   (23.10.09 16:27) [46]

Большое спасибо, Сергей. Теперь понятно.


Сергей М.   (2009-10-23 16:27:00) [2]


> vlad2   (23.10.09 16:16) [44]


Хост-приложение при инициализации грузит пакет tee, тот в свою очередь при своей инициализации регистрирует в RTL свои классы.

Теперь ты грузишь свою либу. Система же при загрузке либы видит, что tee уже имеется в АП процесса и не грузит ее, соотв-но повторная иниц-ция tee не происходит.


Leonid Troyanovsky   (2009-10-23 16:20:00) [3]


> vlad2   (23.10.09 16:16) [44]

> А почему же этого не происходит, если в хост-приложение
> мы включаем tee?

Видимо, в борьбе под ковром побеждает хост.

--
Regards, LVT.


vlad2   (2009-10-23 16:16:00) [4]


> Сергей М. ©   (23.10.09 14:50) [43]

А почему же этого не происходит, если в хост-приложение мы включаем tee?


Сергей М.   (2009-10-23 14:50:00) [5]


> vlad2   (23.10.09 14:36) [42]


И хост-приложение и DLL при включенных крыжиках использования ран-тайм пакетов пользуют один и тот жеэкз-р RTL, который ведет списки зарегистрированных классов.

Стартует хост-приложение и при инициализации юнита тичарт-движка (ибо он фигуририрует в uses) регистрирует в RTL соотв.классы, в т.ч. TChartAxisTitle.

Далее хост-приложение грузит либу, в которой в uses также фигурирует тичарт-движок, который для инициализации получает управление, при этом лезет в ту же RTL для регистрации тех же классов, которые там ранее были зарегистрированы хост-приложением, и получает при этом отлуп в виде исключения "A class named ... already exists", ибо в одном и том же списке зарегистрированных классов НЕ может быть двух одноименных классов.


vlad2   (2009-10-23 14:36:00) [6]


> Сергей М. ©   (23.10.09 14:32) [41]
>
> где была засада и кто в ней сидел


?


Сергей М.   (2009-10-23 14:32:00) [7]


> vlad2   (23.10.09 14:27) [40]


Ну победить-то ты победил, с чем тебя и поздравляем, а вот где была засада и кто в ней сидел - ты, видимо, так и не понял)


vlad2   (2009-10-23 14:27:00) [8]


> Сергей М. ©   (23.10.09 13:10) [39]
>
> Не верю.


И правильно :).
Когда создал голое приложение без тичарта, длл нормально загрузилась. Тогда стал внимательно смотреть свой проект (он довольно большой и закрученный) и нашёл-таки маленький старый паршивый юнит со ссылкой на тичарт, который в данном приложении, конечно, не нужен. Это была последняя ссылка, после удаления которой всё пошло.

Большое спасибо Сергею М. и Игорю Шевченко, чьи посты подвигли меня на более жёсткий досмотр проекта.


Сергей М.   (2009-10-23 13:10:00) [9]


> Не помогает


Не верю.
Показывай все uses в хост-проекте и его юнитах ..


Игорь Шевченко   (2009-10-23 13:02:00) [10]

vlad2   (23.10.09 12:35) [35]

Пытаюсь воспроизвести ситуацию:

Есть проект:

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.Button1Click(Sender: TObject);
type
 TPlotChartProc = procedure (AParent: TWinControl);
var
 LibHandle: HMODULE;
 PlotChartProc: TPlotChartProc;
begin
 LibHandle := LoadLibrary('ChartDLL.DLL');
 Win32Check(LibHandle > 0);
 @PlotChartProc := GetprocAddress(LibHandle, 'PlotChart');
 Assert(Assigned(PlotChartProc));
 PlotChartProc(Self);
end;

end.


Есть DLL

library ChartDll;

uses
 SysUtils,
 Classes,
 ChartDllMain in 'ChartDllMain.pas';

{$R *.res}

exports
 PlotChart;

begin
end.


И юнит в этой DLL

unit ChartDllMain;

interface
uses
 Controls;

procedure PlotChart (AParent: TWinControl);

implementation
uses
 TeeProcs, TeEngine, Chart;

procedure PlotChart (AParent: TWinControl);
var
 Chart1: TChart;
begin
 Chart1 := TChart.Create(AParent);
 with Chart1 do
 begin
   Name := 'Chart1';
   Parent := AParent;
   Left := 92;
   Top := 32;
   Width := 400;
   Height := 250;
   Title.Text.Clear;
   Title.Text.Add('TChart');
   TabOrder := 1;
 end;
end;

end.


Никаких ошибок в проекте не возникает, DLL загружается, Chart показывается.
Проект на пакет от TeeChart не ссылается никаким образом


vlad2   (2009-10-23 13:02:00) [11]


> Сергей М. ©   (23.10.09 12:37) [36]
>
> Я предлагаю выкорчевать из проекта хост-приложения все упоминания
> о тичарте


Не помогает :(


Сергей М.   (2009-10-23 12:37:00) [12]


> vlad2   (23.10.09 12:12) [33]


> предлагаешь строить графики ручками?


Я предлагаю выкорчевать из проекта хост-приложения все упоминания о тичарте, а не только из списка используемых пакетов времени выполнения.

Это полностью соответствует как твоим требованиям

> "Импортёр" функции не обязан знать, как там строится график

в частности, так и здравому смыслу использования плагинов в целом.


vlad2   (2009-10-23 12:35:00) [13]


> Игорь Шевченко ©   (23.10.09 12:31) [34]
> Если я правильно понимаю ситуацию, то:
> 1. Имеется некая DLL, которая наружу экспортирует функцию
> построения графика (и неважно, каким компонентом он будет
> построен)
> 2. Если DLL использует TeeChart, то DLL не загружается
> 3. Если DLL скомпилирована с пакетами и приложение скомпилировано
> с пакетами, то для успешной загрузки необходимо, чтобы приложение
> тоже ссылалось на TeeChart
>


Да.


Игорь Шевченко   (2009-10-23 12:31:00) [14]

Если я правильно понимаю ситуацию, то:
1. Имеется некая DLL, которая наружу экспортирует функцию построения графика (и неважно, каким компонентом он будет построен)
2. Если DLL использует TeeChart, то DLL не загружается
3. Если DLL скомпилирована с пакетами и приложение скомпилировано с пакетами, то для успешной загрузки необходимо, чтобы приложение тоже ссылалось на TeeChart

Я не ошибся ?


vlad2   (2009-10-23 12:12:00) [15]


> Сергей М. ©   (23.10.09 11:54) [32]
>
> Вот и не используй тичарт нигде


Т.е. предлагаешь строить графики ручками?


Сергей М.   (2009-10-23 11:54:00) [16]


> она грузится в любом другом приложении, если я не использую
> тичарт


Вот и не используй тичарт нигде- ни в списке линкуемых bpl, ни в списках uses.


vlad2   (2009-10-23 11:40:00) [17]

Получается так, что всё работает, только если в проект и длл, и гл.приложения включён пакадж tee. Если из проекта гл.приложения исключить tee, то длл не грузится, что является, по-моему, показателем кривизны тичарта. Потому что какой бы кривой длл ни была, она грузится в любом другом приложении, если я не использую тичарт и НЕ грузится, если использую тичарт, а в приложениях не загружен tee.


Сергей М.   (2009-10-23 08:47:00) [18]


> Импортёр" функции не обязан знать, как там строится график


Вполне логично.

Тогда зачемв usesхост-проекта или каких-то из юнитов в его составе у тебя фигурирует юнит TeEngine ?


Сергей М.   (2009-10-23 08:20:00) [19]

Хрень какая-то ..

Как это так ?
С одной стороны

> Импортёр" функции не обязан знать, как там строится график

и при этом

> если не знаешь про  TChart, то пользоваться этой длл нельзя


??


Германн   (2009-10-23 00:43:00) [20]


> Объект TChart определён, создан  и используется только внутри
> функции.


> Экспортируемая функция строит график и бросает его в файл.

Интересно что за "график", для построения которого необходимо непременно использовать VCL-компонент TChart? Или всё дело в "бросает его в файл"?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо