Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

Пункт меню из DLL   Найти похожие ветки 

 
9899100   (2008-08-07 13:40) [0]

Подскажите плииз почему не вставляет пункт меню из 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;
....


 
Palladin ©   (2008-08-07 13:42) [1]

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


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


> FreeLibrary(H);


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

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

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

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

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


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

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

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


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


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


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


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


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


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


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


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


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

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

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


 
Palladin ©   (2008-08-07 14:13) [7]

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


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

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


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


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


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

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

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


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


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


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

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

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


 
Palladin ©   (2008-08-07 14:27) [11]


> 9899100   (07.08.08 14:20) [8]

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

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


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


> ну а фигня в MainForm


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


 
Palladin ©   (2008-08-07 14:50) [13]

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


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

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

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


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


> 9899100   (07.08.08 15:03) [14]


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



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

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1218046013
SveTTT
2008-08-06 22:06
2008.09.21
Отбор максимального значения


15-1217179982
Перебежчик
2008-07-27 21:33
2008.09.21
Как это будет на C#?


15-1216745340
@!!ex
2008-07-22 20:49
2008.09.21
DOS с записью в NTFS


2-1218546905
Павлик
2008-08-12 17:15
2008.09.21
Сортировка по возростанию


2-1218381466
кирилл
2008-08-10 19:17
2008.09.21
подскажите тип