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

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

Пункт меню из DLL


9899100 ©   (2008-08-07 13:40:00) 

Подскажите плииз почему не вставляет пункт меню из DLL?? ругаеться матом на Acess violation :(((
вот исходник DLL
...
Var AppStore:TApplication;

Procedure InitModule(App:TApplication); stdcall;
Var mm,ni:TMenuItem;
Begin
AppStore:=Application;
Application:=App;
ni:=TMenuItem.Create(Application);
ni.Caption:='проба';
mm:=Application.MainForm.Menu.Items.Find('Файл');
mm.Add(ni);
Application:=AppStore;
End;
....

вызов в программе
....
Procedure TMainForm.LoadDLL;
Var H:Integer;
   InitP:Procedure(App:TApplication); stdcall;
Begin
H:=LoadLibrary('template.dll');
If H<>0 Then
 Begin
  @InitP:=GetProcAddress(H,'InitModule');
  if @InitP<>nil Then InitP(Application);
  FreeLibrary(H);
 End;
end;
....


Сергей М.   (2008-08-07 15:19:00) [1]


> 9899100   (07.08.08 15:03) [14]


Ну и на десерт - все эти прыжки с бубном вокруг передачи-подмены Application тоже ни к чему, если вызывающий и вызываемый модули используют один и тот же экз-р VCL и RTL. Достигается это оч просто - проекты всех взаимодействующих модулей собираются с установленной опцией Build With Run-Time Packages (см. опции проектов, закладка Packages)


9899100   (2008-08-07 15:03:00) [2]

на счет stdcall
согласен :) в принципе и правда кроме как у себя я использовать не буду то мона и не ставить :)

и на счет фигни в MainForm тоже Сергей прав :)
в обработчике onCreate объекта как такового нету


Palladin   (2008-08-07 14:50:00) [3]

ну это да, конечно...
о чем и говорится в [6], а фигня, видимо потому, что только в одном месте stdcall убрал :)


Сергей М.   (2008-08-07 14:40:00) [4]


> ну а фигня в MainForm


А там не может быть "фигни" - это статическое поле объекта Application, оно либо nil либо кажет на объект-форму. Объект-форма еще не создана, значит там nil, а не "фигня")


Palladin   (2008-08-07 14:27:00) [5]


> 9899100   (07.08.08 14:20) [8]

stdcall это всего лишь соглашение о передаче параметров, в твоем случае оно есть бессмысленно, бо нигде более, акромя приложениях написанных на delphi, ты не сможешь библиотекой пользоватся, так что убирай везде, delphi то уж сама с собой согласна... )

ну а фигня в MainForm, видимо потому что пытаешься ты операцию эту провести в OnCreate формы, кое событие вызывается из конструктора формы, и Application.CreateForm еще не дождался создания объекты формы и не присвоил свойству созданный объект


Сергей М.   (2008-08-07 14:25:00) [6]


> так работает


Не будет это работать, не выдумывай небылиц.

Строка 'проба' живет ровно столько, сколько живет твоя dll.

Ты убил dll и вместе с ней убил эту строку.
А на нее ведь ссылается свойство ni.Caption !


Сергей М.   (2008-08-07 14:21:00) [7]


> причем ежели не stdcall


Опять ты своё доллдонишь)

Ты пойми - применение этого спецификатора должно быть оправдано!

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


9899100   (2008-08-07 14:20:00) [8]

угу проверил :)
фигняс там почемуто
вроде бы передаю Application
а вот значение MainForm у него какаято белеберда а не главная форма
вощем передал дополнительный параметр MainMenu
и добавил прямо к нему
так работает


Palladin   (2008-08-07 14:13:00) [9]

точно, не приметил строчку... ну и ладно... ну все равно
но проверить значение mm, после вызова Find, ты просто обязан!)


9899100   (2008-08-07 14:10:00) [10]

>>Сергей М. ©
причем ежели не stdcall то ошибка вылетает с адресом 0000
а в другом случае уже похожим на правду

вылетает на строчке
if @InitP<>nil Then InitP(Application);


Сергей М.   (2008-08-07 14:04:00) [11]


> ошибка вылетает при вызове функции InitP


Ну так пройдись отладчиком пошагово и проконтролируй, какая строчка и какой ее элемент не соответствует ожидаемому состоянию)


> везеде сказанно что вызов должен быть Stdcall


Да ничего подобного.


Сергей М.   (2008-08-07 14:02:00) [12]


> Palladin ©   (07.08.08 13:42) [1]


Нет, на время хитромудрых манипуляций он подменяет ссылку на callee.Application ссылкой на caller.Application.. Здесь всет правильно, хотя и бестолковые эти телодвижения)


9899100   (2008-08-07 14:00:00) [13]

>>Palladin ©
Яж его меняю на переданный

>>Сергей М. ©
Дык ошибка вылетает при вызове функции InitP
а StdCall тф имеешь ввиду где ??
ежели в DLL то вроде так везеде сказанно что вызов должен быть Stdcall


Сергей М.   (2008-08-07 13:48:00) [14]


> FreeLibrary(H);


У тебя новорожденный элемент меню "живет" нормальной жизнью ровно столько, сколько "живет" dll.

А ты ее, эту dll, своими же руками выкорчевываешь якобы за ненадобностью)

Чему ж тут удивляться ?

Ну и традиционный вопрос на засыпку:

за каким лешим указано stdcall  ?


Palladin   (2008-08-07 13:42:00) [15]

интересный ты человек... параметром передаешь Appхост-приложения, а пользуешься Applicationобъектом dll...


Наверх

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