AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

C-Library in Delphi einbinden

Ein Thema von Der Jan · begonnen am 22. Dez 2005 · letzter Beitrag vom 23. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#1

C-Library in Delphi einbinden

  Alt 22. Dez 2005, 14:59
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 hier, aber das ist nicht so ganz, was ich suche.

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 ?
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: C-Library in Delphi einbinden

  Alt 22. Dez 2005, 15:04
C-Libs gehen IMHO überhaupt nicht, allerdings kannst du mit
{$L Dateiname.obj} eine stinknormale Object-Datei einbinden (ähnlich wie mit $R und Ressourcen).

//Edit: Tippfehler korrigiert
//Nachtrag: hier mal ansatzweise wie's in ZLIB gemacht wird:
Delphi-Quellcode:
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.
Wichtig: die Aufrufkonvention muss stimmen, bei dir wahrscheinlich cdecl oder stdcall statt pascal.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#3

Re: C-Library in Delphi einbinden

  Alt 22. Dez 2005, 15:17
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:
procedure memset(a: Pointer; b: Integer; c: Cardinal); cdecl;
begin
  FillMemory(a,c,b);
end;
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.
Gibt es Alternativen?
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: C-Library in Delphi einbinden

  Alt 22. Dez 2005, 17:28
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:
#define memset(a,b,c) FillMemory(a,c,b)
Ggf. findest du über Google ja eine include-Datei, die so was schon macht.

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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#5

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 07:29
Das mit der msvcrt werd ich mal testen. WEnn nicht, heißt es halt, viel Arbeit über Weihnachten
Kennt vielleicht jemand entprechende Include Dateien bzw. Import für die msvcrt? Bin grad beim ersten Suchen noch nicht so fündig geworden...
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 10:32
Bei den Schweizern gibt's hier einen Beispielcode, der malloc, realloc und free aus msvcrt.dll einbindet und damit den Borland Memory-Manager überflüssig macht.

Ä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:
implementation

const
  msvcrt = 'msvcrt.dll';

procedure printf; cdecl; external msvcrt;
procedure fopen; cdecl; external msvcrt;
procedure fclose; cdecl; external msvcrt;
// ...
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:

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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#7

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 10:39
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...
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 10:50
Zitat von Der Jan:
Delphi meckert nur bei den Funktionen/Variablen, die wirklich genutzt werden, also ohne die richtigen prototypes wird das nix...
Wie sehen denn die Fehlermeldungen aus?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#9

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 10:55
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:
var
  __errno: integer; external;

// oder
 
  __errno: integer; external 'msvcrt.dll';
Mag er gar nicht... Diese Variablen sind aber u.U. wichtig.
Fragen über Fragen

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
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: C-Library in Delphi einbinden

  Alt 23. Dez 2005, 11:19
Zitat von Der Jan:
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:
var
  __errno: integer; external;

// oder
 
  __errno: integer; external 'msvcrt.dll';
Mag er gar nicht... Diese Variablen sind aber u.U. wichtig.
Wenn du selbst in Delphi die Variable nicht brauchst, dann deklariere sie einfach als Funktion. Ist ein billiger Trick, aber du willst ja nur dem Linker das Symbol bekannt machen.
function __errno: intger; external 'msvcrt.dll';
Zitat von Der Jan:
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
Hast du sie denn so deklariert?
function strlen: integer; cdecl; external 'msvcrt.dll'; oder
procedure strlen; cdecl; external 'msvcrt.dll';
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz