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

Вниз

Пункт меню из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
15-1217578343
Vlad Oshin
2008-08-01 12:12
2008.09.21
интересную задачку нашел


3-1206102916
Still Swamp
2008-03-21 15:35
2008.09.21
TParam и BLOB


3-1206358955
Альберт
2008-03-24 14:42
2008.09.21
Как сформировать запрос с апострофом


6-1192447120
Адепт
2007-10-15 15:18
2008.09.21
Изменяем октеты в ip адресе. Изменяем Маску подсети. КАК?


2-1218439126
Нов_и_чок
2008-08-11 11:18
2008.09.21
Из ASCII в ANSI





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