Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Вниз

XPmanifest и Dll (большой ворос)   Найти похожие ветки 

 
Babay   (2004-01-26 07:49) [0]

Доброго времени суток уважаемые.
Вопрос этот возник у меня давно (с самого начала использования Д7). Но проблему удалось довольно легко обойти (об этом позже), но вот теперь все же захотелось разобраться в истоках.
Итак имеем:
Библиотека которая содержит в себе ПУСТУЮ НИЧЕГО НЕ ДЕЛАЮЩУЮ форму. И одну экспортируемую функцию которая отображает эту форму в модальном режиме. Вот код:

library problib;
uses
SysUtils,Classes,Unit1 in "Unit1.pas" {Form1},forms;
{$R *.res}

procedure ShowForm(h:Thandle);stdCall;
Var form:TForm1;
begin
application.handle:=h;
Form:=TForm1.create(application);
Form.ShowModal;
Form.release;
end;

exports
ShowForm name "ShowForm";

begin
end.


Далее имеем пустой проект с одной кнопкой которая вызывает эту форму из Dll.

// статическое подключение библиотеки
procedure ShowForm(h:Thandle);stdCall; external "Problib.dll" name "ShowForm";

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowForm(application.Handle);
end;


Действие 1
A) компилим библиотеку
б) запускаем проект давим кнопку, все ок форма показалась
в) закрываем форму закрываем проект ВСЕ В ПОРЯДКЕ.

Действие 2
Добавляем на форму в библиотеке элемент TSTRINGGRID, можно TSpeedButton или TTabControl.
A) компилим библиотеку
б) запускаем проект давим кнопку, все ок форма показалась
в) закрываем форму закрываем проект ВСЕ В ПОРЯДКЕ.

Действие 3
Добавляем в проект элемент XPManifest.
A) компилим библиотеку
б) запускаем проект давим кнопку все ок форма показалась
в) закрываем форму все ОК
Г) закрываем проект и ... получаем ошибку
"Project C:\....\Project1.exe raised too many consecutive exception:"access violation at 0x00333126: read of address 0x00963e7c". Process Stoped."

теперь придется вырубать приложение через Ctrl+F2

Действие 4
Удаляем из проекта элемент XPManifest и модуль XPMan.
A) компилим библиотеку
б) запускаем проект давим кнопку все ок форма показалась
в) закрываем форму закрываем проект ВСЕ В ПОРЯДКЕ.

Обойти ошибку можно подключая библиотеку не статически как в примере, а динамически через LoadLibrary, GetProcAddress. Вроде и проблема решена но всетаки откуда грабли найти не удалось.
Напрашиваются следующие выводы:

1) У меня руки кривые
2) Если неукого больше это не проявляется значит уменя кривая копия дельфей
3) Может все таки глюк от дядюшки Бормана?

Хотелось бы услышать мнение всеми нами уважаемых знатоков...
Заранее спасибо всем откликнувшимся.


 
tesseract   (2004-01-26 09:38) [1]

application.handle:=h;
Form:=TForm1.create(application);
Form.ShowModal;
Form.release;

С этим кодом возможны траблы в любой версии D - форму следует освобождать вызовом другой функции - а так работает 50/50. А почему - скорее всего что-то с выделением памяти. и лучше бы проверить указатели.


 
Babay   (2004-01-26 10:07) [2]

> этим кодом возможны траблы в любой версии DВаши предложения ?
> форму следует освобождать вызовом другой функции
какой ?
А почему работает при динамическом подключении библиотеки?

Судя по тому что удалось раскопать ошибка возникает где то в менеджере стилей в Д. (если я чего не попутал)


 
Babay   (2004-01-26 12:00) [3]

может ответят такие МАСТЕРА как Anatoly Podgoretsky, Юрий Зотов ?


 
Babay   (2004-01-27 05:14) [4]

up....



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.029 c
3-16172
Александр Бакулин
2004-01-13 17:22
2004.02.06
Построение текстовых отчетов


1-16235
Serginio666
2004-01-26 19:38
2004.02.06
Вопрос по Хэлперам


3-16040
RUYurik
2004-01-13 05:59
2004.02.06
Лицензия для InterBase 7.0


3-16101
CraKer
2004-01-10 23:12
2004.02.06
Сортировка по алфавиту


4-16824
Владислав
2003-11-27 10:16
2004.02.06
Tooltips в Toolbar под XP.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский