Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-23364
Lexer
2003-04-21 09:29
2003.05.08
DBGridEh


1-23062
wowik_cn
2003-04-24 09:50
2003.05.08
Формат данных в Excel


1-23110
maxon
2003-04-24 09:51
2003.05.08
string -> PAnsiChar


1-23220
ctapik
2003-04-25 13:47
2003.05.08
Как добавить прозрачную картинку


3-23031
lia
2003-04-18 13:02
2003.05.08
Восстановление MSSQL базы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский