dll Erstellung unter Windows
-
- Beiträge: 3
- Registriert: So 15. Apr 2012, 12:29
- OS, Lazarus, FPC: Allerlei (L 0.9.30.2 FPC 2.4.4)
- CPU-Target: 32Bit
dll Erstellung unter Windows
Hallo zusammen,
für ein Programmpaket, welches aus vielen kleinen Einzelprogrammen besteht, will ich die gemeinsamen Funktionen in eine dll packen (unter Linux soll's dann natürlich eine so werden).
Zum Testen habe ich eine einfach dll mit einer "Hallo Welt"-Funktion gebaut. Diese lässt sich auch aufrufen, jedoch erhalte ich nach deren Aufruf sofort einen SIGSEGV.
Leider habe ich im Internet noch nichts gefunden. Hat jemand für mich ein einfaches Beispiel bzw. ein Link zu einem Tutorial/HowTo wie man dynamische Bibliotheken "richtig" programmiert?
Vielen Dank,
Steffen
für ein Programmpaket, welches aus vielen kleinen Einzelprogrammen besteht, will ich die gemeinsamen Funktionen in eine dll packen (unter Linux soll's dann natürlich eine so werden).
Zum Testen habe ich eine einfach dll mit einer "Hallo Welt"-Funktion gebaut. Diese lässt sich auch aufrufen, jedoch erhalte ich nach deren Aufruf sofort einen SIGSEGV.
Leider habe ich im Internet noch nichts gefunden. Hat jemand für mich ein einfaches Beispiel bzw. ein Link zu einem Tutorial/HowTo wie man dynamische Bibliotheken "richtig" programmiert?
Vielen Dank,
Steffen
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: dll Erstellung unter Windows
Wenn du referenzgezählten Strings zwischen Bibliothek und Anwendung austauschen möchtest musst du die Units sharemem (Windows) oder cmem (*nix) als erstes deine Anwendung und Bibliothek aufnehmen.dr.disk hat geschrieben:Zum Testen habe ich eine einfach dll mit einer "Hallo Welt"-Funktion gebaut. Diese lässt sich auch aufrufen, jedoch erhalte ich nach deren Aufruf sofort einen SIGSEGV.
Diese beiden Units implementieren andere Speichermanager, sodass Anwendung und Bibliothek auf den Speicher des jeweils anderen zugreifen dürfen.
Die Alternative: Du verwendest ausschließlich PChar (bzw. PWideChar/PUnicodeChar für Widestring bzw. UnicodeString).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
Wurde ich nicht tun. Gibt momentan mit FPC nur Ärger.dr.disk hat geschrieben:Hallo zusammen,
für ein Programmpaket, welches aus vielen kleinen Einzelprogrammen besteht, will ich die gemeinsamen Funktionen in eine dll packen (unter Linux soll's dann natürlich eine so werden).
-
- Beiträge: 3
- Registriert: So 15. Apr 2012, 12:29
- OS, Lazarus, FPC: Allerlei (L 0.9.30.2 FPC 2.4.4)
- CPU-Target: 32Bit
Re: dll Erstellung unter Windows
Wegen? Bzw. wo liegen da (derzeit?) die Probleme mit FPC?marcov hat geschrieben:Wurde ich nicht tun. Gibt momentan mit FPC nur Ärger.
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: dll Erstellung unter Windows
Grundsätzlich sollte man nur abkapselbare Bibliotheken, die ein C-Interface haben, in DLLs auslagern.
Komplette Klassen, so wie es mit MS-C++ geht, geht bei FPC nicht (ist auch nirgends spezifiziert, wie es denn gehen sollte, dazu hat das FPC-Sprachdesign zu viele Seiteneffekte)
Wie sieht denn der Code deiner Hello World aus?
Welche Aufrufkonvention verwendest du?
Komplette Klassen, so wie es mit MS-C++ geht, geht bei FPC nicht (ist auch nirgends spezifiziert, wie es denn gehen sollte, dazu hat das FPC-Sprachdesign zu viele Seiteneffekte)
Wie sieht denn der Code deiner Hello World aus?
Welche Aufrufkonvention verwendest du?
-
- Beiträge: 3
- Registriert: So 15. Apr 2012, 12:29
- OS, Lazarus, FPC: Allerlei (L 0.9.30.2 FPC 2.4.4)
- CPU-Target: 32Bit
Re: dll Erstellung unter Windows
Morgen!
Ich will da im wesentlichen nur eine "Funktionssammlung" auslagern. Also mehr oder weniger nur Funktionen welche ich in den unterschiedlichen Modulen immer wieder mal brauche.
Als Aufrufkonvention verwende ich cdecl.
Ich will da im wesentlichen nur eine "Funktionssammlung" auslagern. Also mehr oder weniger nur Funktionen welche ich in den unterschiedlichen Modulen immer wieder mal brauche.
Als Aufrufkonvention verwende ich cdecl.
Code: Alles auswählen
function hello (lname: string): string; cdecl;
begin
result := 'Hallo ' + lname;
end;
Re: dll Erstellung unter Windows
Ich würde das für den Gebrauch innerhalb Freepascal nicht machen.
Wenn du die Funktionen aus C etc, benutzen willst, ergibt sich das Interface so:
function hello (lname: PChar): PChar; cdecl;
Wenn du die Funktionen aus C etc, benutzen willst, ergibt sich das Interface so:
function hello (lname: PChar): PChar; cdecl;
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: dll Erstellung unter Windows
Nicht wirklich.theo hat geschrieben:Ich würde das für den Gebrauch innerhalb Freepascal nicht machen.
Wenn du die Funktionen aus C etc, benutzen willst, ergibt sich das Interface so:
function hello (lname: PChar): PChar; cdecl;
Code: Alles auswählen
procedure hello(lname: PChar; outtext: PChar; maxlen: integer); cdecl;
-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
Keine Unterstützung? FPC hat kein Packages Konzept wie Delphi um darum zu arbeiten, und keine Flache namespace wie C.dr.disk hat geschrieben:Wegen? Bzw. wo liegen da (derzeit?) die Probleme mit FPC?marcov hat geschrieben:Wurde ich nicht tun. Gibt momentan mit FPC nur Ärger.
Für ein Idee wo die Problemen liegen, siehe http://wiki.freepascal.org/packages" onclick="window.open(this.href);return false;
-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
"Wie" gehts mit MS C++? Irgendwelche URL, oder kannst du das hier kurz Erklären?carli hat geschrieben:
Komplette Klassen, so wie es mit MS-C++ geht, geht bei FPC nicht (
Unsinn. Gleich an Delphi, und Delphi hat Packages. Aber weil die schoen sind (sehr automatisiert), sind die aufwendig, und brauchen viel Kontrolle über den Linker.ist auch nirgends spezifiziert, wie es denn gehen sollte, dazu hat das FPC-Sprachdesign zu viele Seiteneffekte)
-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
In Zukunft vielleicht nicht, weil char,pchar und String dann entweder ansi- oder unicode- sein können, von Kompiler-modus abhaengig.theo hat geschrieben:Ich würde das für den Gebrauch innerhalb Freepascal nicht machen.
Wenn du die Funktionen aus C etc, benutzen willst, ergibt sich das Interface so:
function hello (lname: PChar): PChar; cdecl;
Man soll anfangen sich daran zu gewöhnen um externe Interfaces mit pansichar ansichar usw, zu spezifizieren.
Re: dll Erstellung unter Windows
Da sehe ich den Sinn nicht wirklich. Bei Char meinetwegen, aber PChar sollte doch immer char * und nicht wchar_t * entsprechen.marcov hat geschrieben:
In Zukunft vielleicht nicht, weil char,pchar und String dann entweder ansi- oder unicode- sein können, von Kompiler-modus abhaengig.
Man soll anfangen sich daran zu gewöhnen um externe Interfaces mit pansichar ansichar usw, zu spezifizieren.
-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
Weil?theo hat geschrieben:Da sehe ich den Sinn nicht wirklich. Bei Char meinetwegen, aber PChar sollte doch immer char * und nicht wchar_t * entsprechen.marcov hat geschrieben:
In Zukunft vielleicht nicht, weil char,pchar und String dann entweder ansi- oder unicode- sein können, von Kompiler-modus abhaengig.
Man soll anfangen sich daran zu gewöhnen um externe Interfaces mit pansichar ansichar usw, zu spezifizieren.
In Delphi ist das seit D2009 so. (pchar=punicodechar)
Re: dll Erstellung unter Windows
Wie gesagt, weil PChar doch meistens in der Schnittstelle zu C Libraries verwendet wird, und char * afaik auch nicht "magisch" zu wchar_t * wird, wie Byte auch nicht plötzlich zu Word wird, nur weil es eine neue Delphi Version gibt.marcov hat geschrieben: Weil?

-
- Beiträge: 1104
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: dll Erstellung unter Windows
Nein. C libraries sind überhaupt da nicht im Frage. Delphi ist entworfen um mit winapi zu arbeiten, und winapi hat ein variabler CHAR typ. (variabler abhaengig vom "unicode" define)theo hat geschrieben:
Wie gesagt, weil PChar doch meistens in der Schnittstelle zu C Libraries verwendet wird,
Aber, wichtiger, ins FPC/Delphi dialect sind char und pchar erzwingend äquivalent zu "string". Das ist eben häufiger als C Schnittstellen. Also wenn "string" sich ändert, sollen (p)char mit ändern.
Und mindestens in D2009+ kompatiblen(*) Modi wird "string" sich ändern
(*) wie und ob das getan wird ist eine andere Diskussion