Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 09:40   #1
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
Вопрос EAbstractError MDIChild в DLL,загружаемой неявным образом,проблема с Application

Здравствуйте.
В строчке Child := TMDIChild.Create(Application.MainFo rm); у меня
ошибка - попытка выполнения абстрактного метода.
Когда загружал дочернее окно из DLL явным образом не было такого.
Я намудрил с Application. Переприсвоение с Application делаю,чтобы не
было др. ошибки с MDIChild в DLL.
Код:
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.
Обработчик запуска плагина на выполнение
Код:
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;
Как исправить? И где,что конкретного по этому вопросу почитать?
P.S. 1
Примерно понял в чём ошибка - применять ShareMem. Попробую исправить
P.S. 2
ShareMem проблемы не решает,но ИМХО,ошибка при передаче параметров.
Темы для WordPress. Русские WordPress шаблоны

Последний раз редактировалось Alexei91; 24.09.2010 в 07:16.
Alexei91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема по решению VISUAL BASIC for Application (VBA) Мариночка=)! Microsoft Office Excel 9 17.05.2010 10:13
Циклы с неявным числом повторений Verunya Помощь студентам 2 18.12.2009 19:44
Проблема Application.WorksheetFunction.Match nemoomen Microsoft Office Excel 1 01.04.2009 03:12
как узнать файл загружаемой программы ? juan666777 Общие вопросы Delphi 9 18.03.2009 17:51
Как передать данные в MDIChild-форму, загруженную из dll Shvonder Общие вопросы Delphi 0 18.03.2009 12:46