Interface-Instanz-basierte Plugins auf Linux
spacer
Autor Nachricht
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Mo 25.10.10 01:36 
Hallo,

ganz einfache Frage heute mal: kriegt man sowas unter Linux & Lazarus zum laufen?
(Code ist im Editor entstanden, also: wahrscheinlich nichtmal unter Win direkt compilierfähig :D Mir gehts um das Konzept.)

ausblenden Main.dpr markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
program Main;

uses IntfDef;

function GetIntf: IMyInterface; stdcall; external 'Plugin.dll';

var Foo: IMyInterface;
begin
Foo:= GetIntf;
Foo.TestFunc;
end;

ausblenden Plugin.dpr markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Library Plugin;

uses IntfDef;

type
TIntfImpl = class(TInterfacedObject, IMyInterface)
procedure TestProc; stdcall;
end;

procedure TIntfImpl.TestProc;
begin
//Something
end;

function GetIntf: IMyInterface; stdcall;
begin
Result:= TIntfImpl.Create as IMyInterface;
end;

exports GetIntf;
begin
end;

ausblenden IntfDef.pas markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Unit IntfDef;

interface

type
IMyInterface = interface
['InsertGUIDHere']
procedure TestProc; stdcall;
end;

implementation
end;


In einer Windows/Delphi-Umgebung ist das eine schön einfache Variante Plugins zu bauen. Kriegt man das vernünftig cross-compiliert, oder geht das nicht? Im Grunde ist das ja die Idee hinter COM, und damit eigentlich Windows-Only.
Aber nichts genaues weiß (ich/man) nicht...

Danke,
Sebastian

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 25.10.10 01:40 
Ich sehe erst einmal keinen Grund dagegen (außer, dass es sich um Lazarus handelt, meine jüngsten Erfahrungen damit... ;-)). Bibliotheken gibt es unter Linux genauso wie Interfaces, denn die sind nativ umgesetzt und ein Sprachbestandteil.

Interfaces werden gebraucht um COM benutzen zu können, aber nicht COM um Interfaces benutzen zu können.

// EDIT:
Ach ja: Unter Lazarus gibt es noch eine andere Interface-Art. Corba oder so, hab mir das aber nie näher angeschaut.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Mo 25.10.10 01:56 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
(außer, dass es sich um Lazarus handelt, meine jüngsten Erfahrungen damit... ;-)).
Dann nehm ich halt Kylix... see my point? ;) Spannend ist halt, dass es Delphi compiliert. Was genau, ist mir wurscht ;)
Man darf die Frage auch gerne nach anderen Programmiersprachen stellen, aber dass das funktioniert, weiß ich zumindest unter Win32 auch definitiv.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Interfaces werden gebraucht um COM benutzen zu können, aber nicht COM um Interfaces benutzen zu können.
Klar, aber gibt es außerhalb von COM auch den fest definierten Aufbau im Speicher bzgl. Methodentabelle, Supports etc.? Darauf zielte die Frage ja so ein bisschen ab.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ach ja: Unter Lazarus gibt es noch eine andere Interface-Art. Corba oder so, hab mir das aber nie näher angeschaut.
Die gehen seit D4 (damals groß beworben) wohl auch mit Delphi, aber außer "es gibt kein RefCounting" ist mir an denen noch nichts wirklich seltsames aufgefallen...

EDIT: was mal noch gesagt werden muss: wow, war das eine schnelle Antwort :shock:

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 25.10.10 02:17 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Spannend ist halt, dass es Delphi compiliert.
Da warte ich auf Delphi XE2. Damit werde ich dann auch für Linux mit Pascal entwickeln. Bis dahin quäle ich mich halt mit C++ und Konsorten herum.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Klar, aber gibt es außerhalb von COM auch den fest definierten Aufbau im Speicher bzgl. Methodentabelle, Supports etc.?
Das ist meines Wissens alles unabhängig von COM umgesetzt. Dementsprechend sage ich einmal: Ja. ;-)

Supports selbst ruft ja auch "nur" QueryInterface auf. Und das wiederum ist eine Methode, die das Objekt implementieren muss, damit es als Interface funktioniert.

Nebenbei (weil du das bei Corba angeschrieben :D hast):
Ich unterdrücke teilweise bei der Verwendung von Interfaces auch die Referenzzählung, weil das manches einfach vollkommen undurchsichtig machen würde. Nämlich an den Schnittstellen, wenn man einen Teil des Projektes mit Interfaces umsetzen muss und einen andere Teil ohne. Und das dürfte wohl eher die Regel als die Ausnahme sein.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
EDIT: was mal noch gesagt werden muss: wow, war das eine schnelle Antwort :shock:
Man tut was man kann, ich hab auch schon ein paar mal in der selben Minute geantwortet. :mrgreen:

Für diesen Beitrag haben gedankt: Martok
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 2682
Erhaltene Danke: 26



BeitragVerfasst: Mo 25.10.10 19:27 
Ich denke es spricht nichts dagegen. Bibliotheken gibt es und Interfaces sind auch nur Pointers auf Funktionenstabellen. System.pas hat auch keine Abhängigkeiten zu irgend etwas COM-Spezifischem; TObject.GetInterface gibt es in FPC auch.

Für diesen Beitrag haben gedankt: Martok
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Mo 25.10.10 20:10 
Danke euch beiden, dann glaube ich das mal so ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Implementation
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 33
Erhaltene Danke: 2

Win 7 x64, Debian "Lenny", Ubuntu "Maverick Meerkat"
FPC 2.4.0, VS 2010 Express
BeitragVerfasst: Mo 25.10.10 20:39 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Main.dpr markieren
1:
function GetIntf: IMyInterface; stdcall; external 'Plugin.dll';

Aber es muss dann "Plugin.so" heißen :P
so = Shared Object

_________________
Chuck Norris kann in einem Word 65537 verschiedene Werte speichern. Und das gleichzeitig.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Mo 25.10.10 20:58 
Muss nicht, aber sollte. Das hab ich mal als gegeben angenommen ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home