Форум: "Потрепаться";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
ВнизУстал мучаться с написанием плагинов. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c