Einzelnen Beitrag anzeigen

Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#2

AW: .OBJ-Dateien in Delphi einbinden

  Alt 11. Jun 2011, 15:41
um mal eine Lösung hier in die Bibliothek zu legen, gibt es jetzt noch eine Antwort zu dem Thema.



LIB - OBJ
LIB-Files sind Sammlungen OBJ-Files in einer Datei plus Headerinformation. Beim CBuilder kann man mit tlib32.exe mehrere .obj-Files in ein .lib-File einbinden, was dann mittels #pragma comment( lib, "mylib.lib" ) im Quelltextheader eingebunden wird.

Woher kommen OBJ-Files
Sie werden generiert vom Compiler und dann dem Linker zur Verfügung gestellt. Beim Compilieren eines obj.c Files mit dem Borland C++ Compiler (bcc32 -c obj.c) bekommt man ein OMF.OBJ-File. Auch Delphi bis aktuell XE-1 kann diese generieren (siehe Einstellungen des Compilers), hat aber keinen Linker dafür onboard.

OMF- COFF
OBJ-Files gibt es in verschiedenen Formaten. Hier wären das Intel Object Module Format, OMF und das Common Object File Format (COFF). MS-COFF ist entstanden, als MS NT für Alpha-Prozessoren entwickelte. Microsoft Visual C++-Compiler erstellt COFF-OBJ-Dateien. Delphi erstellt bis XE-1 OMF-OBJ-Dateien.

OMF -> COFF - Wandlung
Bis Delphi 7 mit OMF2D. Delphi OBJ-Files bis D2007 kann man mit in VS-2003 C++-Projekte konvertieren (link -edit omffile.obj oder EDITBIN omffile.obj) und einbinden. Mit VS2005 ist das nicht mehr machbar und bei 64-Bit trennen sich die Wege vollkommen.

COFF -> OMF - Wandlung
Geht mit Tools wie coff2omf von Digital Mars Wobei man dabei auch maximal von VS2005 ausgehen kann. Hier braucht man schon einen Zwischenschritt (link /lib /convert file.lib) um ein älteres COFF-Format zu generieren, was dann mit (coff2omf user32.lib) in das OMF-Format konvertiert werden kann. Hier werden also LIB-Files konvertiert (z.B.: coff2omf user32.lib). So ein Konverter für ein älteres COFF-Format liegt auch CBuilder bei, sogar für dll´s mit den Tools "implib" und "impdef".



OMF-OBJ-Files in Unit einbinden
Um die Routinen einer compilierten OBJ-Datei aufrufen, muss zunächst die die OBJ-Datei mit der Compiler-Direktive $L (oder $LINK) gelinkt werden. Das sieht folgend aus: {$L ROUTINES.OBJ} Diese Anweisung linkt die Datei ROUTINES.OBJ zur akutellen Unit und damit ins eingene Programm. Leider werden die enthaltenen Routinen in Ihr nicht automatisch für Delphi verfügbar, sondern diese müssen, wie bei einer dll, deklariert werden, um sie anschließend aufrufen zu können.

Delphi-Quellcode:
unit zlib;
interface

 {$L deflate.obj}
 {$L inflate.obj}
 {$L inftrees.obj}
 {$L trees.obj}
 {$L adler32.obj}
 {$L infblock.obj}
 {$L infcodes.obj}
 {$L infutil.obj}
 {$L inffast.obj}
   ...
 
 procedure _tr_init; external;
 procedure _tr_tally; external;
 procedure _tr_flush_block; external;
 procedure _tr_align; external;
 procedure _tr_stored_block; external;
 procedure adler32; external;
 procedure inflate_blocks_new; external;
 ...
  
implementation

 procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl;
 begin
 FillChar(P^, count, B);
 end;

 procedure _memcpy(dest, source: Pointer; count: Integer);cdecl;
 begin
 Move(source^, dest^, count);
 end;
 ...
Ein C-Compiler nimmt nich das Delphi "StdCall", sondern "cdecl" als Compiler-Direktive, dass muss im Aufruf der Funktion angegeben werden.
Martin Schaefer

Geändert von mschaefer (11. Jun 2011 um 20:51 Uhr) Grund: ergänzt
  Mit Zitat antworten Zitat