57 / 34 / 0
Регистрация: 06.08.2010
Сообщений: 159
1

EAbstractError MDIChild в DLL,загружаемой динамически,Application

23.09.2010, 10:00. Показов 1632. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
В строчке Child := TMDIChild.Create(Application.MainForm); у меня
ошибка - попытка выполнения абстрактного метода.
Когда загружал дочернее окно из DLL явным образом не было такого.
Я намудрил с Application. Переприсвоение с Application делаю,чтобы не
было др. ошибки с MDIChild в DLL.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var
  DllApp: TApplication;
 
procedure ShowMDIChild(MainApp: TApplication);
var
  Child: TMDIChild;
begin
  if not Assigned(DllApp) then
  begin
    DllApp := Application;
    Application := MainApp;
  end;
  Child := TMDIChild.Create(Application.MainForm);'ЗДЕСЬ ОШИБКА'
  Child.Show;
end;
 
procedure MyDLLProc(Reason: Integer);
begin
  if (Reason = DLL_PROCESS_DETACH)and(Assigned(DllApp)) then
  Application := DllApp;
end;
 
function PluginType: PChar; stdcall;
begin
  PluginType := 'MainForm';  //Тип плагина
end;
 
function PluginName: PChar; stdcall;
begin
  PluginName := 'Пример плагина с MDIChild';
end;
 
function PluginExec(MainApp: TApplication): Boolean; stdcall;
begin
  try
    PluginExec := True;
    ShowMDIChild(MainApp);
  except
    PluginExec := False;
  end;
end;
 
exports
  PluginType, PluginName, PluginExec;
 
begin
  DLLProc := @MyDLLProc;
end.
Обработчик запуска плагина на выполнение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TfMain.PluginClick(Sender: TObject);
var
  PluginExec : function(AObject : TObject): Boolean; stdcall;
  PluginType : function: PChar; stdcall;
  FileName   : string;
  Handle     : THandle;
 
begin
  with (Sender as TMenuItem) do FileName := PluginList.Strings[MenuIndex];
 
  Handle := LoadLibrary(PChar(FileName));
  if Handle <> 0 then
  begin
    @PluginExec := GetProcAddress(Handle, 'PluginExec');
    @PluginType := GetProcAddress(Handle, 'PluginType');
 
    if PluginType = 'MainForm' then
    if PluginExec(Application) = False then
    ShowMessage('Ошибка выполнения');
 
  end;  
  FreeLibrary(Handle);
end;
Как исправить? И где,что конкретного по этому вопросу почитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2010, 10:00
Ответы с готовыми решениями:

Можно ли из MDIchild формы открывать другую Mdichild форму?
Поясню. Mdichild(дочерняя форма) содержится в mdiform(родительская форма), из родительской формы...

Ошибка: Access Violation при создании MDIChild формы в dll XE7
Здравствуйте коллеги. Два дня бьюсь, не могу решить, очень нужна ваша помощь. Суть проблемы:...

Точка входа в процедуру REGISTER APPLICATION RESTART не найдена в библиотеке DLL KERNEL 32.dll
Ошибка выпадает при загрузке WinXP. Как быть ?

Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll
Здравствуйте. Подключил afx.h, появилась ошибка. Из-за чего? Что делать?

3
Йошь-мыслитель
126 / 120 / 26
Регистрация: 22.02.2009
Сообщений: 706
Записей в блоге: 5
24.09.2010, 00:02 2
Цитата Сообщение от АлексейБ Посмотреть сообщение
if PluginExec(Application) = False then
А не проще ли так:
Delphi
1
if not PluginExec(Application) then
Далее. Application - есть глобальная переменная модуля Forms. Если вы будете её переопределять, тем более из библиотеки, не имеющей по сути этой переменной по определению (так как библиотека, а не приложение), то готовьтесь к непредсказуемым последствиям. Кстати, модуль ShareMem используете?

Добавлено через 1 минуту
Кстати, а вообще на кой так мудрить было?
1
57 / 34 / 0
Регистрация: 06.08.2010
Сообщений: 159
24.09.2010, 07:24  [ТС] 3
Xander_Bass нашёл ссылку о ShareMem - точно мой случай
http://www.cyberguru.ru/progra... page8.html
P.S.
Переопределение Application делал,чтобы Child-окно из DLL "видело" главное окно (в исполняемом файле).
Этот способ работал при явной загрузке DLL из приложения.
DLL:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var 
  DllApp: TApplication;
  Child: TMDIChild;
 
procedure ShowMDIChild(MainApp: TApplication);
begin
  if not Assigned(DllApp) then 
  begin 
    DllApp := Application; 
    Application := MainApp;
  end;
  Child := TMDIChild.Create(Application.MainForm);
  Child.Show;
end;
 
procedure MyDLLProc(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    if Assigned(DllApp) then
      Application := DllApp;
end;
 
exports ShowMDIChild;
 
begin
   DLLProc := @MyDLLProc;
   Child.Free;
end.
Исполняемый файл
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
procedure ShowMDIChild(MainApp: TApplication); external 'dllforms.dll';
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMDIChild(Application);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Cascade;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Tile;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  ArrangeIcons;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  showmessage(inttostr(MDIChildCount));
end;
 
procedure TForm1.Button6Click(Sender: TObject);
var
  I: Integer;
begin
 For i := 0 To MDIChildCount - 1 Do
 if Assigned(MDIChildren[i]) then MDIChildren[i].Close;
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
  if Assigned(ActiveMDIChild) then ActiveMDIChild.Close;
end;
 
end.
ShareMem проблемы не решает - добавлял в оба dpr 1-м подключаемым модулем - не в строках проблема,
а что-то с Application.
0
Йошь-мыслитель
126 / 120 / 26
Регистрация: 22.02.2009
Сообщений: 706
Записей в блоге: 5
24.09.2010, 13:31 4
Цитата Сообщение от АлексейБ Посмотреть сообщение
DllApp := Application; Application := MainApp;
Кстати, советую эти строчки местами поменять. А то как-то нелогично получается.
0
24.09.2010, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2010, 13:31
Помогаю со студенческими работами здесь

Application.CreateForm в DLL
Доброго времени суток. Возник вопрос. Допустим если мы добавляем в проект уже созданную где либо...

Динамически подключить dll
Здравствуйте! Если приложение и dll написанные на C#. Как подключить библиотеку так, чтоб если она...

Динамически подключить dll
необходимо подключить библиотеку динамически. в каждой из возможных библиотек есть метод Mask(int...

Qt - This application has failed to start because mingwm10.dll was not found
Здравствуйте. На Windows XP почтавил Qt Creator . Компилирую проект, запускаю exe`шник и вылезает ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru