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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 19:31   #1
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию Проблема с dll

Все привет.
Вообщем пишу программу, в ней реализовал plugin систему.
Но при подключение и вызове методов из dll вылазиют нелепые ошибки.
Суть в том, что одна dll может быть подключена несколько раз, и функции могут быть вызваны в одно и тоже время.
Некоторые части программы.
Типы:
Код:
type
  TPluginInfo = record
    Name: pchar;
    Version: pchar;
    Author: pchar;
    About: pchar;
    ForBoard: pchar;
  end;
  TInitParams = record
    Owner: Integer;
    ProcLog: procedure(const s: string);
    IPointer: Pointer;
    NewAdProc: function(const Ad: Tad; const IPointer: Pointer): boolean;
    Page: pchar;
  end;

  PlugInExecute = procedure;
  PlugInGetAds = procedure(const PageN:integer);
  PlugInInit = procedure(const Params: TInitParams);
  PlugInGetInfo = function: TPluginInfo;

  TPlugIn = class
    Info: TPluginInfo;
    Loaded: boolean;
    Address: Integer;
    GetAds: PlugInGetAds;
    GetInfo: PlugInGetInfo;
    Init: PlugInInit;
    Execute: PlugInExecute;
  end;
Подключение:
Код:
function LoadPlugin(const FN: string): TPlugIn;
var
  FileName: string;
begin
  Result := TPlugIn.Create;
  Result.Loaded := false;
  if FileExists(FN) then
    FileName := FN
  else if FileExists(ExtractFileDir(paramstr(0)) + '\' + FN) then
    FileName := ExtractFileDir(paramstr(0)) + '\' + FN
  else
    exit;
  try
    Result.Address := LoadLibrary(pchar(FileName));
    if Result.Address = 0 then
      exit;
  except
    exit;
  end;
  @Result.GetInfo := GetProcAddress(Result.Address, 'GetInfo');
  if (@Result.GetInfo = nil) then
    exit;
  @Result.Execute := GetProcAddress(Result.Address, 'Execute');
  if (@Result.Execute = nil) then
    exit;
  @Result.Init := GetProcAddress(Result.Address, 'Init');
  if (@Result.Init = nil) then
    exit;
  @Result.GetAds := GetProcAddress(Result.Address, 'GetAds');
  if (@Result.GetAds = nil) then
    exit;
  Result.Loaded := true;
end;
Инит:
Код:
  if FindFirst(ExtractFileDir(paramstr(0)) + '\' + PluginsDirName + '\*' +
    PlugInsExt, faAnyFile, SR) = 0 then
  begin
    repeat
      r.Expression := '(' + StringReplace(SR.Name, PlugInsExt, '',
        ReplaceFlags) + ')';
      if (SR.Attr <> faDirectory) and (r.Exec) then
      begin
        PlugIn := LoadPlugin(ExtractFileDir(paramstr(0)) + '\' + PluginsDirName
          + '\' + SR.Name);
        Params.Owner := HInstance;
        Params.ProcLog := Log;
        Params.Page := pchar(self.Link);
        Params.NewAdProc := NewAd;
        Params.IPointer := Pointer(self);
        result := true;
        PlugIn.Init(Params);
        PlugIn.Info := PlugIn.GetInfo;
        // tray('Plugin: ' + PlugIn.Info.Name + ' loaded.' + cl + 'Info: ' +
        // PlugIn.Info.About + ' . ' + cl + 'Ver: ' + PlugIn.Info.Version + cl +
        // 'Author: ' + PlugIn.Info.Author, 'PlugIn Info');
        r.Free;
        exit;
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
    r.Free;
  end;
Все это дело вызывается в динамическом потоке.
Кольша вне форума Ответить с цитированием
Старый 16.12.2013, 19:52   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Может кто посоветует свой вариант реализации системы плагинов?
Кольша вне форума Ответить с цитированием
Старый 16.12.2013, 21:25   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Через Interface.
Человек_Борща вне форума Ответить с цитированием
Старый 16.12.2013, 21:44   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

нелепые ошибки. из за ProcLog: procedure(const s: string);

а интерфейсы тоже при stringах не помогут
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 16.12.2013 в 21:46.
Slym вне форума Ответить с цитированием
Старый 16.12.2013, 21:54   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
TPlugIn = class
Info: TPluginInfo;
Loaded: boolean;
Address: Integer;
GetAds: PlugInGetAds;
GetInfo: PlugInGetInfo;
Init: PlugInInit;
Execute: PlugInExecute;
end;
и зачем дублировать данные
eval вне форума Ответить с цитированием
Старый 16.12.2013, 22:11   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Сей труд изучен http://www.gunsmoker.ru/2008/12/1.html ?
phomm вне форума Ответить с цитированием
Старый 17.12.2013, 15:03   #7
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

eval, я что то не увидел, где я продублировал?
Человек_Борща, можно на примере?
Мне нужно инициализировать плагин, и вызвать из него одну процедуру с передачей ей следующие параметры:
Код:
    ProcLog: procedure(const s: string);
    IPointer: Pointer;
    NewAdProc: function(const Ad: Tad; const IPointer: Pointer): boolean;
    Page: pchar;
   PageN:integer;
Посмотрел исходники, не пойму как добавить и вызвать новую функцию(процедуру).
Получается ее надо добавлять в шаблон IPlugin?
Кольша вне форума Ответить с цитированием
Старый 17.12.2013, 15:57   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
а интерфейсы тоже при stringах не помогут
При widestring'ах им пофигу string'и.
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2013, 16:00   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,888
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
При widestring'ах им пофигу string'и.
Почему пофигу?
northener вне форума Ответить с цитированием
Старый 17.12.2013, 16:45   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
Почему пофигу?
Потому что WideString(он же BSTR), это системный тип данных, и этим типом данных управляет системный менеджер(от ОС который) памяти а не программный.
Почему так.... читаем далее тут.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с DLL alumium Общие вопросы Delphi 5 18.08.2012 00:59
Проблема с dll Anton911 Общие вопросы Delphi 1 07.01.2012 15:40
проблема с DLL DarkCrystal Visual C++ 4 25.09.2011 12:12
Проблема с DLL Crabobass Общие вопросы Delphi 3 22.04.2011 00:06
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05