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

Вниз

Глюк от Борланда ????   Найти похожие ветки 

 
BabayS   (2002-11-10 05:51) [0]

Здравствуйте уважаемые!!
У меня вот какая проблема.
Поставил я себе Delphi 7. Все отлично все хорошо.
Да вот вылез баг незнаю че с ним делать.
Дело в следующем
пишу DLL в ней есть форма на которой лежит StringGrid и SpeedButton с картинкой.
форма ничего не делает.
вот код DLL

library stgAsmEditor;

uses
SysUtils,
forms,
Unit1 in "Unit1.pas" {Form1};

{$R *.res}

procedure ShowF(app:THandle);stdCall;
begin
application.Handle:=app;
form1:=TForm1.Create(application);
form1.ShowModal;
form1.Release;
end;

exports
showF name "ShowF";

begin
end.

Далее в программе по кнопке вызываю форму из DLL
(моя программа поддерживает стили WindowsXP)

// подключаем DLL
procedure ShowF(app:THandle);stdCall;
external "stgAsmEditor.dll" name "ShowF";

......

procedure TForm1.Button3Click(Sender: TObject);
begin
ShowF(application.Handle);
end;

кроме этого в программе больше ничего нет и она больше ничего не делает!

форма показывается и работает. Затем ее закрываем и закрываем программу.
Вот тут то и появляется ошибка:
Память неможет быть "Read". A затем Runtime error 216...

в ходе попыток выяснения в чем дело выяснилось что если включена
поддержка стилей Windows Xp это и происходит. Если нет поддержки то все ОК.
если не вызывать форму то тоже все ок.

Что это баг от борланда? Может кто подскажет чего с этим делать?
Может есть какой сервис пак на D7?
Раньше в D5 у меня это работало без проблем. Может в D7 като надо по другому?
Помогите пожалуйста!!

у меня D7.0 Build 4.453


 
Наезжалкин   (2002-11-10 10:20) [1]

Нужен Service pack.


 
BabayS   (2002-11-10 10:27) [2]

А где он есть?


 
BabayS   (2002-11-10 10:31) [3]

Итак отвечаю сам себе.

Значит так ежели подключать DLL не статически а динамически (т.е. самому грузить искать тама функцию использовать а потом самому выгружать) то подобной беды не происходит однако ежели в DLL написать вызов формы так:

procedure ShowF(app:THandle);stdCall;
begin
application.Handle:=app;
form1:=TForm1.Create(application);
form1.ShowModal;
form1.Release;
end;

то после того как вы закроете форму окно вашей программы которое вызывало форму изчезнет с экрана. Лечится так: после вызова формы из DLL надо написать
Visible:=False;
Visible:=True;

Или убрать строку
application.Handle:=app;
из показанного выше примера, но тогда форма будет иметь кнопку на панели задач.

(хм. как выяснилось это происходит невсегда т.е. в некоторых случаях форма остается видимой 8=)))# )

Вот такое шаманство. Конечно нет желания подключать DLL динамически ежели без нее прога всеравно не работает, но что делать...
Пока решаю этот вопрос так. Надеюсь все же это решимо нормальными путями и статическое подключении DLL с формой то же возможно.
Вот тока как??


 
Fantasist   (2002-11-11 00:04) [4]

Тут скорее всего типичная ошибка использования глобальной переменной. Так как переменная Application для dll и для основной программы разные, и несут, пожалуй,слегка разную нагрузку, то подобное обращение с этой переменной может спровацировать разные конфликты. Чтобы точно знать что происходит, тебе надо внимательно изучить модуль forms, его секции инициализации и завершения, использование переменной application внутри этого модуля, а так же сам класс TApplication.


 
Armeng   (2002-11-11 13:36) [5]

Тут никакой ошибки нету.
Просто dll не умеет экспортировать классы.
Вместо dll используй bpl и не будет никаких ошибок.


 
Dimka Maslov   (2002-11-11 13:46) [6]

Перед выходом из процедуры вставь
Application.Handle:=0;


 
Fantasist   (2002-11-11 20:28) [7]


> Тут никакой ошибки нету.
> Просто dll не умеет экспортировать классы.
> Вместо dll используй bpl и не будет никаких ошибок.


Что-то я не заметил в вышеприведенных примерах попытку экспорта класса.


 
Armeng   (2002-11-12 14:14) [8]

> Что-то я не заметил в вышеприведенных примерах попытку
> экспорта класса.

Да?
А вы попробуйте вместо dll- а bpl.
Или поставить галку Project->Options>->Packages->Build with runtime packages.

Дело в том, про вызове TForm.Create вызываются некоторые методы TApplication, экземпляр которого должен быть одинаков и в .exe и в dll. Так как dll не умеет экспортировать методы класса, получаются разные Application для dll и exe, хотя Application.Handle у обоих одинаков.

И вообще лучше не хранить классы в dll. Для этого есть bpl.


 
BabayS   (2002-11-19 10:58) [9]

Уважаемые!!!
Я не храню классы в DLL. Просто у меня есть формы в ДЛЛ. На которых находится например StringGrid. Когда подключаешь функцию вызова формы из ДЛЛ и при этом приложение использует слили ХР то и получается описанный глюк.
Далее вызов формы производится таким путем согластно толстому толмуту по Дельфи написанному одним из разработчиков (ща нету под рукой чтобы точно указать какой)
насчет
>Дело в том, про вызове TForm.Create вызываются некоторые методы TApplication,
>экземпляр которого должен быть одинаков и в .exe и в dll. Так как dll не умеет
>экспортировать методы класса, получаются разные Application для dll и exe, хотя
>Application.Handle у обоих одинаков.

вот что бы этого избежать и делается
application.Handle:=app;

Происходит это тока на D7 при включенных стилях. Раньше у меня так все работало (D5) и проблем небыло!!!

> А вы попробуйте вместо dll- а bpl.
а если мне надо именно DLL? У меня куча прог используют одни и теже библиотеки и нетока Дельфийские проги.
Так что это похоже все же глюк... :=))#



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

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

Наверх





Память: 0.47 MB
Время: 0.007 c
1-93081
LongIsland
2002-11-16 17:04
2002.11.28
Перетаскивание Image a по Image у


14-93241
CAdept
2002-11-07 14:31
2002.11.28
Elpack


4-93291
Alexander
2002-10-17 14:24
2002.11.28
Вопрос по директивам условной компиляции:


3-92936
Travex
2002-11-11 19:26
2002.11.28
Замена IBX


1-93129
Gayrus
2002-11-17 13:41
2002.11.28
Как Borland y это удалось?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский