Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемс с плагинами 
:(
    Опции темы
AlexeyShestchenko
Дата 19.2.2008, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



Понадобилось прикрутить к приложению плагины для возможности разширения функционала.
Сначала опишу задачу, потом о проблеме.
Т.к. мне не нужна загрузка плагинов при создании формы, то список плагинов находится в файле и загружается stringlist;
В каждом плагине должно быть по 1-3 функции, все они работают с текстом который получают(должны получать) из программы и возращают обработанный вариант в memo. Функции все готовы осталось только организовать работу с плагинами.
В edit программы пишется название плагина через пробел текст и параметры обработки.
Поскитался по инету в надежде найти исходники и примеры по работе с плагинами,но они что-то все плохо рабочие.
Например:
Код

var
      Form1: TForm1;
      GetSimpleText: function(LangRus: Boolean): PChar;
      LibHandle: THandle;

procedure Button1Click(Sender: TObject);
begin
  {"Чистим" адрес функции от "грязи"}
  @GetSimpleText := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
    @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');
    {Если и здесь все OK}
    if @GetSimpleText <> nil then
      {...то вызываем эту функцию и показываем результат}
      ShowMessage(StrPas(GetSimpleText(True)));
  end;
  {И не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);
end;


и Dll:
Код

library mydll;

uses SysUtils, Classes;

{Определяем функцию как stdcall}
function GetSimpleText(LangRus: Boolean): PChar; stdcall;
begin
  {В зависимости от LangRus возвращаем русскую (True) либо английскую (False) фразу}
  if LangRus then
    Result := PChar('Здравствуй, мир!')
  else
    Result := PChar('Hello, world!');
end;

{Директива exports указывает, какие функции будут экспортированы этой DLL}
exports GetSimpleText;

begin
end.


после показа мессаги выскакивает в дебаггер :(

Как я понимаю, то программа должна обрабатывать текст взятый из эдита, первое слово будет название плагина,дальше она должна отадавать плагину текст с параметрами обработки, тот в свою очередь обрабатывает и отправляет в memo программы. Нужна возможность указывать вместо текста ссылку на файл,тогда обрабьотка будет занимать некоторое время,знач над делать еще и возможность в потоке.
Помогите разобраться! Буду благодарен!
PM MAIL   Вверх
Qu1nt
Дата 19.2.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Вот так будет правильней:
Код

  GetSimpleText: function(LangRus: Boolean): PChar; stdcall;

PM MAIL   Вверх
ivan219
Дата 19.2.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



И ещё помойму нужно в uses провисать ShareMem только надо его прописывать не в юнете формы а в файле проекта.
Код

program Project1;

uses
  ShareMem, Forms,
  Unit1 in 'Unit1.pas' {Form1};

PM MAIL ICQ   Вверх
AlexeyShestchenko
Дата 19.2.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



Цитата(ivan219 @ 19.2.2008,  15:31)
И ещё помойму нужно в uses провисать ShareMem только надо его прописывать не в юнете формы а в файле проекта.
Код

program Project1;

uses
  ShareMem, Forms,
  Unit1 in 'Unit1.pas' {Form1};

с использованием sharemem вылетает ошибка на выхохе,чето там invalid pointer
PM MAIL   Вверх
Qu1nt
Дата 19.2.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Мой вариант не работает?
PM MAIL   Вверх
AlexeyShestchenko
Дата 19.2.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



Цитата(Qu1nt @ 19.2.2008,  18:51)
Мой вариант не работает?

твой работает,спасибо!
PM MAIL   Вверх
Rennigth
Дата 19.2.2008, 18:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(ivan219 @  19.2.2008,  15:31 Найти цитируемый пост)
И ещё помойму нужно в uses провисать ShareMem

Это для использования стрингов.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
AlexeyShestchenko
Дата 19.2.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



function GetText(Text:String): PChar; stdcall;
var
  i:integer;
begin
  for i:=0 to 20 do
  Result := PChar(text+inttostr(i));
end;


эта функция возращает text+20

а мне надо чтобы возращала все от 0 до 20,как сделать?
PM MAIL   Вверх
THandle
Дата 19.2.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



AlexeyShestchenko, так пойдет?
Код


function GetText(Text:String): PChar; stdcall;
var
  i:integer;
begin
  result := nil;
  for i:=0 to 20 do
    Result := PChar(Result + text + inttostr(i));
end;


Это сообщение отредактировал(а) THandle - 19.2.2008, 20:38
PM   Вверх
AlexeyShestchenko
Дата 19.2.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



спасибо, это я для теста сделал простой алгоритм, а если там довольно тяжелоемкий анализ и результаты будут не сразу,хотелось бы чтобы по мере получения одного из результов они уже появлялись в результе и я мог видеть это дело у себя в программе в memo!
PM MAIL   Вверх
aktuba
Дата 19.2.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



AlexeyShestchenko, используй WideString и забудь о PChar... И никаких дополнений в uses прописывать не надо.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
source777
Дата 19.2.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(AlexeyShestchenko @  19.2.2008,  21:01 Найти цитируемый пост)
хотелось бы чтобы по мере получения одного из результов они уже появлялись в результе и я мог видеть это дело у себя в программе в memo!
Для этого, по хорошему, надо вынести цикл из dll в главную программу, а в dll оставить тело цикла, которое будет на каждой итерации возвращать текущее значение...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
AlexeyShestchenko
Дата 19.2.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



спасибо, но предыдущую тему не могу решить
PM MAIL   Вверх
remax
Дата 19.2.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



JEDI VCL - фореве!

Там есть готовая реализация механизма плагинов и 5 (!)  работающих примеров. Охватываю самые разные варианты реализации.


Насчет ShareMem: обсуждалось на форуме, например - 
http://forum.vingrad.ru/faq/topic-157676.html


Это сообщение отредактировал(а) remax - 19.2.2008, 23:05


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
AlexeyShestchenko
Дата 19.2.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.2.2008

Репутация: нет
Всего: нет



JEDI VCL, чет не нашел там примера по плагинам...
может не то скачал....


source777, 

вот для примера решил засунуть в длл idicmpclient, длл принимает хост и начинает пинговать его. Разумеется в главное приложение должен приходить ответ о том как дошли пакеты.
пишу в длл:
Код

function IdIcmpClient1Reply:WideString;
var
  AReplyStatus: TReplyStatus;
begin
  Result := IntToStr(AReplyStatus.SequenceId); //получаем результат
end;

// сам пинг
function ping(host:string):Boolean;
begin
Result := False;
  if host = '213.180.204.8' then
  begin
    IdIcmpClient1 := TIdIcmpClient.Create(nil);
    IdIcmpClient1.Host := host;
    IdIcmpClient1.ReceiveTimeout := 2000;
    IdIcmpClient1.Ping;
    Result := True;
    IdIcmpClient1.Free;
  end;
end;

function GetText(Text:String): WideString; stdcall;
begin
if ping(Text) then
  Result := idIcmpClient1Reply
  else
  Result := 'no';
end;


вроде правильно возращает результат,но если нажимать дальше на кнопку,то будет добавляться одно и тоже значение почему?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1195 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.