![]() |
C-Library in Delphi einbinden
Hallo zusammen,
ich kämpfe gerade damit, eine C-Library in Delphi einzubinden und, was soll ich sagen, ich habe so einige Probleme damit. Es gibt zwar schon einen ähnlichen Thread ![]() Also: Wenn ich die C-Library als DLL kompiliere (mittels C-Builder) , kann ich sie in Delphi ja problemlos nutzen. Nur dummerweise kann ich für mein Programm keine externen Files verwenden, muß alles in einer Datei sein. Deshalb habe ich das ganze als statische Bibliothek (LIB) kompiliert und hab Delphi daruaf losgelassen. Nur dieses weigert sich hartnäckig, diese zu akzeptieren. Kann man in Delphi überhaupt C-Libs einbinden ?? Wenn ja, wie ? |
Re: C-Library in Delphi einbinden
C-Libs gehen IMHO überhaupt nicht, allerdings kannst du mit
Delphi-Quellcode:
eine stinknormale Object-Datei einbinden (ähnlich wie mit $R und Ressourcen).
{$L Dateiname.obj}
//Edit: Tippfehler korrigiert //Nachtrag: hier mal ansatzweise wie's in ZLIB gemacht wird:
Delphi-Quellcode:
Wichtig: die Aufrufkonvention muss stimmen, bei dir wahrscheinlich cdecl oder stdcall statt pascal.
unit ZlibIntf;
interface uses SysUtils, Classes; // utility functions function adler32(adler: Cardinal; Buffer: Pointer; Len: Cardinal): Cardinal; pascal; function crc32(crc: Cardinal; Buffer: Pointer; Len: Cardinal): Cardinal; pascal; implementation //------------------------------------------------------------ {$L adler32.obj} {$L crc32.obj} function adler32; external; function crc32; external; end. |
Re: C-Library in Delphi einbinden
Schonmal danke.
Die Objekt Dateien linken geht . Hab ich auch schon probiert, leider ist das auch nicht das gelbe vom Ei. Das Problem hierbei ist, das Funktionen aus der RTL (C-Runtime Library) in diesen nur als Verweise vorhanden sind, diese werden normal später von C-Linker eingebunden. Binde ich die obj jetzt in Pascal ein, kennt dieser die RTL-Funktionen (z.B. malloc, strlen usw...) natürlich nicht, und meldet entsprechend "ungenügende Forward oder external deklaration" ... Möglich wäre jetzt sich diese Funktionen selbst zu schreiben, so ala:
Delphi-Quellcode:
Allerdings kann das sehr aufwendig werden, da sich nicht alle Funktionen so einfach implementieren lassen und dies u.U. auch sehr viele sein könnten.
procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
begin FillMemory(a,c,b); end; Gibt es Alternativen? |
Re: C-Library in Delphi einbinden
Die erste Möglichkeit hast du schon genannt: die Funktion in Delphi definieren.
Die zweite Möglichkeit ist, dies in C schon zu machen und über Makros die Funktionen umzudefinieren. Beispiel:
Code:
Ggf. findest du über Google ja eine include-Datei, die so was schon macht.
#define memset(a,b,c) FillMemory(a,c,b)
Dritte Alternative wäre, die msvcrt von Microsoft hinzu zu linken (gibt's so weit ich weiß auf jedem Betriebssystem) - ich weiß aber auf Anhieb nicht ob schon jemand dafür eine Import-Deklarations-Unit geschrieben hat. Allerdings gibt's dann Probleme wenn die Funktionen reservierten Speicher als Ergebnis zurückgeben, den du wieder frei geben musst. |
Re: C-Library in Delphi einbinden
Das mit der msvcrt werd ich mal testen. WEnn nicht, heißt es halt, viel Arbeit über Weihnachten :wink:
Kennt vielleicht jemand entprechende Include Dateien bzw. Import für die msvcrt? Bin grad beim ersten Suchen noch nicht so fündig geworden... |
Re: C-Library in Delphi einbinden
Bei den Schweizern gibt's
![]() Ähnlich sähe es bei dir auch aus. Wenn du die Routinen nicht benutzt, dann reicht es wahrscheinlich sogar aus, sie ohne wirklichen Prototypen zu deklarieren - es muss ja nur der Name bekannt sein. Beispiel:
Delphi-Quellcode:
Wenn der eingebundene C-Code Speicher benötigt, dann solltest du allerdings entweder den in der Bibliothek oben beschriebenen Weg gehen oder die Funktionen selbst neu definieren, also:
implementation
const msvcrt = 'msvcrt.dll'; procedure printf; cdecl; external msvcrt; procedure fopen; cdecl; external msvcrt; procedure fclose; cdecl; external msvcrt; // ...
Delphi-Quellcode:
function malloc(size: integer): pointer; cdecl;
begin Result := AllocMem(size); end; function calloc(count, size: integer): pointer; cdecl; begin Result := AllocMem(count * size); FillChar(Result^, count * size, #0); end; function realloc(ptr: pointer; size: integer): pointer; cdecl; begin Result := ReAllocMem(ptr, size); end; procedure free(ptr: pointer); cdecl; begin FreeMem(ptr); end; |
Re: C-Library in Delphi einbinden
Jo danke,
das Beispiel auf dsdt.info hatte ich schon gefunden, hab auch schon einige C-Funktionen neu geschrieben. Muß halt mal sehen, wie ich es am besten mache. Delphi meckert nur bei den Funktionen/Variablen, die wirklich genutzt werden, also ohne die richtigen prototypes wird das nix... |
Re: C-Library in Delphi einbinden
Zitat:
|
Re: C-Library in Delphi einbinden
Was mich doch gleich zur nächsten Frage bringt, ist aber eher syntaxtechnisch, den das müßte in Delphi eigentlich gehen: Wie binde ich externe Variablen ein?
Delphi-Quellcode:
Mag er gar nicht... Diese Variablen sind aber u.U. wichtig.
var
__errno: integer; external; // oder __errno: integer; external 'msvcrt.dll'; Fragen über Fragen :coder2: zur letzten Antwort: [Fehler] LibBarcodeDelphi.pas(139): Ungenügende Forward- oder External-Deklaration: 'strlen' Ist ja klar, woher soll er sie denn aber auch kennen :) |
Re: C-Library in Delphi einbinden
Zitat:
Delphi-Quellcode:
function __errno: intger; external 'msvcrt.dll';
Zitat:
Delphi-Quellcode:
oder
function strlen: integer; cdecl; external 'msvcrt.dll';
Delphi-Quellcode:
procedure strlen; cdecl; external 'msvcrt.dll';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz