Форум: "Начинающим";
Текущий архив: 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.006 c