Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.08;
Скачать: CL | DM;

Вниз

Устал мучаться с написанием плагинов.   Найти похожие ветки 

 
acsoft ©   (2003-04-18 14:59) [0]

Объявляется вознаграждение в размере 60000 показов баннеров в сети TBN.Strict тому, кто напишет работоспособную пару EXE-DLL. DLL является плагином к EXE. Как это должно работать: exe является простой пустой формой, обрабатывающей событие OnCreate. При наступлении этого события программа открывает папку Plugins и загружает оттуда (например, при помощи функций findfirst, findnext) все DLL-плагины (loadlibrary, т.е. динамически, имена библиотек заранее неизвестны). Каждый плагин создает какой-либо объект на форме (например, кнопку) и подставляет в процедуры обработки событий объекта вызов каких-либо функций и процедур, описанных в плагине (например, при нажатии на созданную кнопку перекрасить окно программы в красный цвет).
Конструкция, написанная мной (см.ниже), постоянно вызывает ошибку.
Всех заинтересовавшихся просьба написать письмо мне на acsoft@mail.ru (в форум я захожу редко). В будущем возможно вы захотите сами участвовать в написании плагинов для программы, а её мы (дизайнер, пытающийся создать нормальный сайт; переводчик на английский и немецкий и я - типа программист :)) продаем и обещаем делиться прибылью с вами.

library Project2;
uses
Windows, SysUtils, Classes, Controls, Forms, StdCtrls;

{$R *.RES}

function CallPlugin(parent:TForm):boolean; stdcall;
var
Newbut:TButton;
begin
newbut:=tbutton.Create(parent);
newbut.parent:=parent;
newbut.Visible:=true;
result:=true;
end;

exports
CallPlugin;
end.

{------------}

unit Unit1;
...
procedure TForm1.Button1Click(Sender: TObject); (ну, в нашем случае нужно заменить на TForm1.Create)
var
LibHandle: THandle;
CallPlugin: function(parent:TForm):boolean;
begin
LibHandle:=loadlibrary("project2.dll");
if LibHandle >= 32 then begin
CallPlugin:= GetProcAddress(LibHandle,"CallPlugin");
CallPlugin(form1);
end;
FreeLibrary(LibHandle);
end;
...


 
Digitman ©   (2003-04-18 15:16) [1]


> CallPlugin: function(parent:TForm):boolean; stdcall;

!!!!

как минимум должны совпадать соглашения о вызовах между вызывающим и вызываемым кодами !

у тебя они не совпадают - вызывающий код использует по-умолчанию регистровые Паскаль-соглашения, вызываемый же - stdcall.

Вот тебе и грабли ! Самые большие - это уж точно)


А ты тут базар рекламный развел !)))


 
Dms   (2003-04-18 15:23) [2]


> Вот тебе и грабли ! Самые большие - это уж точно)

это не самые большие
самые большие в том, что есть попытка ПЕРЕДАТЬ ОБЪЕКТ в dll


 
Dms   (2003-04-18 15:23) [3]

а баннеры на хлеб не намажешь :)


 
savva ©   (2003-04-18 15:24) [4]


> library Project2;

много обещающее название для программы на продажу:)))


 
DiamondShark ©   (2003-04-18 15:28) [5]

Packages спасут гиганта банерообмена.


 
Digitman ©   (2003-04-18 15:35) [6]


> Dms



> самые большие в том, что есть попытка ПЕРЕДАТЬ ОБЪЕКТ в
> dll


думается, это не самые большие, ибо в вопросе ничего не сказано об опциях сборки проектов плагина и хост-приложения... но - тоже лупануть нехило могут !)


 
Anatoly Podgoretsky ©   (2003-04-18 15:42) [7]

DiamondShark © (18.04.03 15:28)
Только кража
Паниковский


 
Palladin ©   (2003-04-18 15:52) [8]


> и я - типа программист :))

хорошо подметил - типа


 
Mystic ©   (2003-04-18 16:16) [9]

Я бы поступил примерно так:

PluginApp.dpr, MainUnit.pas
===========================

procedure TMainForm.FormShow(Sender: TObject);
var
AppPath: string;
SR: TSearchRec;
begin
AppPath := ExtractFilePath(Application.ExeName);
if FindFirst(AppPath + "*.bpl", faArchive, SR) = 0 then
begin
repeat
LoadPackage(AppPath + SR.Name)
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;


Test.dpk
========

package Test;

{$R *.res}
// Skiped
{$DESCRIPTION "Plugin to Application"}
{$RUNONLY}
{$IMPLICITBUILD OFF}


requires
rtl,
vcl;

contains
TestPluginUnit in "TestPluginUnit.pas";

end.


TestPluginUnit.pas
==================

unit TestPluginUnit;

interface

uses Forms, StdCtrls;

implementation

procedure InitPlugin;
var
Form: TForm;
begin
Form := Application.MainForm;
with TButton.Create(Form) do
begin
Parent := Form;
Visible := True;
end;
end;

initialization
InitPlugin;

end.


В опциях сборки проекта поставить флаг Build with runtime packages и там указать хотя бы rtl и vcl (а лучше все что предлагается :)) Все должно разделяться между плагином и основным приложением, оформлять в виде пакета. И пробелем не должно возникать.



Страницы: 1 вся ветка

Текущий архив: 2003.05.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
6-23272
mixamixa
2003-03-14 07:24
2003.05.08
Определить IP-адрес компьютера


1-23165
_DarkSide
2003-04-24 14:56
2003.05.08
Помогите с OpenDialog


3-22937
Tomkat
2003-04-18 13:05
2003.05.08
Поик подстроки символов


1-23098
I/O
2003-04-25 16:47
2003.05.08
клоны?!


14-23320
Некто2002
2003-04-18 20:35
2003.05.08
XP, showmessage и