![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
<B>DLL</B> не грузится, если в ней <B>TChart</B> [D7, WinXP]
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? Или всё дело в "бросает его в файл"?